Files
peko-ios/YuMi/Modules/YMRoom/View/MessageContainerView/UNIFIED_TEXT_LAYOUT_README.md

107 lines
3.2 KiB
Markdown
Raw Normal View History

# 统一文本尺寸计算实现
## 概述
本次修改统一了应用中的文本尺寸计算方法,解决了阿拉伯文本显示问题,提高了 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 不变
- **回滚**:如有问题可快速回滚到原有逻辑