107 lines
3.2 KiB
Markdown
107 lines
3.2 KiB
Markdown
![]() |
# 统一文本尺寸计算实现
|
|||
|
|
|||
|
## 概述
|
|||
|
|
|||
|
本次修改统一了应用中的文本尺寸计算方法,解决了阿拉伯文本显示问题,提高了 RTL(从右到左)文本的渲染精度。
|
|||
|
|
|||
|
## 主要修改
|
|||
|
|
|||
|
### 1. XPNetImageYYLabel.m
|
|||
|
|
|||
|
**修改前:**
|
|||
|
- 使用条件分支:RTL 文本使用 `boundingRectWithSize`,非 RTL 文本使用 `YYTextLayout`
|
|||
|
- 导致 RTL 文本计算不准确
|
|||
|
|
|||
|
**修改后:**
|
|||
|
- 统一使用 `YYTextLayout` 进行所有文本尺寸计算
|
|||
|
- 新增 `createTextContainerForText:` 方法,根据文本方向配置容器
|
|||
|
- RTL 文本使用 `YYTextTruncationTypeStart`,LTR 文本使用 `YYTextTruncationTypeEnd`
|
|||
|
|
|||
|
### 2. XPMessageInfoModel.m
|
|||
|
|
|||
|
**修改前:**
|
|||
|
- 检测到阿拉伯字符时额外增加 20 点高度
|
|||
|
- 可能导致高度计算不准确
|
|||
|
|
|||
|
**修改后:**
|
|||
|
- 移除额外的阿拉伯文本高度调整
|
|||
|
- 优化 `YYTextContainer` 配置,根据文本方向设置截断类型
|
|||
|
- 依赖 `YYTextLayout` 的精确计算
|
|||
|
|
|||
|
### 3. 新增测试文件
|
|||
|
|
|||
|
- `XPTextLayoutTest.h/m`:提供测试方法验证修改效果
|
|||
|
- 包含纯阿拉伯文本、混合文本、长文本的测试用例
|
|||
|
|
|||
|
## 技术细节
|
|||
|
|
|||
|
### YYTextContainer 配置
|
|||
|
|
|||
|
```objc
|
|||
|
- (YYTextContainer *)createTextContainerForText:(NSAttributedString *)text {
|
|||
|
YYTextContainer *container = [YYTextContainer new];
|
|||
|
container.size = CGSizeMake(kRoomMessageMaxWidth, MAXFLOAT);
|
|||
|
|
|||
|
// 根据文本方向配置容器
|
|||
|
if (isMSRTL()) {
|
|||
|
container.truncationType = YYTextTruncationTypeStart;
|
|||
|
} else {
|
|||
|
container.truncationType = YYTextTruncationTypeEnd;
|
|||
|
}
|
|||
|
|
|||
|
return container;
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
### 统一计算逻辑
|
|||
|
|
|||
|
```objc
|
|||
|
- (void)updateLayoutWithAttributedText:(NSAttributedString *)attributedText {
|
|||
|
// 统一使用 YYTextLayout 进行文本尺寸计算
|
|||
|
YYTextContainer *container = [self createTextContainerForText:attributedText];
|
|||
|
YYTextLayout *layout = [YYTextLayout layoutWithContainer:container text:attributedText];
|
|||
|
CGSize finalSize = layout.textBoundingSize;
|
|||
|
|
|||
|
if (self.updateLayoutSize) {
|
|||
|
self.updateLayoutSize(finalSize);
|
|||
|
}
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
## 优势
|
|||
|
|
|||
|
1. **精确性**:`YYTextLayout` 对复杂文本(包括 RTL)有更好的支持
|
|||
|
2. **一致性**:统一的计算方法确保所有文本类型的一致性
|
|||
|
3. **可维护性**:减少条件分支,代码更简洁
|
|||
|
4. **性能**:避免重复计算和额外的高度调整
|
|||
|
|
|||
|
## 测试
|
|||
|
|
|||
|
运行测试验证修改效果:
|
|||
|
|
|||
|
```objc
|
|||
|
#import "XPTextLayoutTest.h"
|
|||
|
|
|||
|
// 在适当的地方调用
|
|||
|
[XPTextLayoutTest runAllTests];
|
|||
|
```
|
|||
|
|
|||
|
## 注意事项
|
|||
|
|
|||
|
1. 确保 `YYText` 库版本支持所需功能
|
|||
|
2. 测试各种文本场景,特别是长文本和混合文本
|
|||
|
3. 验证在不同设备和系统版本上的表现
|
|||
|
4. 关注性能影响,特别是在大量文本的场景下
|
|||
|
|
|||
|
## 后续优化建议
|
|||
|
|
|||
|
1. **字体优化**:为阿拉伯文本自动选择合适的字体(如 "GeezaPro")
|
|||
|
2. **缓存机制**:为频繁计算的文本添加缓存
|
|||
|
3. **性能监控**:添加性能指标监控文本计算耗时
|
|||
|
4. **更多测试**:增加边界情况和性能测试
|
|||
|
|
|||
|
## 风险评估
|
|||
|
|
|||
|
- **低风险**:核心逻辑修改,但使用成熟的 `YYTextLayout`
|
|||
|
- **兼容性**:保持现有 API 不变
|
|||
|
- **回滚**:如有问题可快速回滚到原有逻辑
|