需求
接口返回html角标的字符串,前端转化成NSMutableAttributedString去渲染
"text": "<font color=#6B462E >您有</font><font color=#FB4E44 >18</font><font color=#6B462E >张券可使用</font>",
- 这样的需求一般都是文案比较短,但是变化频率高,且带样式
- app端需要转换成NSMutableAttributedString然后使用UILabel或者UIButton显示
遇到的坑
- 方案1如下
NSMutableAttributedString *attrStr = [[NSMutableAttributedString alloc] initWithData:[html dataUsingEncoding:NSUnicodeStringEncoding]
options:@{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType}
documentAttributes:nil
error:nil];
// 必须设置对其方式,否则没有按照UILabel设置的对齐方式显示,而是居左显示
NSMutableParagraphStyle *paragrahStyle = [[NSMutableParagraphStyle alloc] init];
[paragrahStyle setAlignment:self.textAlignment];
[attrStr addAttributes:@{NSFontAttributeName:font ? : self.font,
NSParagraphStyleAttributeName:paragrahStyle,
NSBaselineOffsetAttributeName:@(NSUnderlineStyleSingle)
}
range:NSMakeRange(0, attrStr.length)];
- 备注1:以上方案需要放在异步线程中,如果不放在异步线程中会导致主线程卡死。
- 备注2:在异步线程中转化完成后,进入主线程给.attributedText赋值,绘制界面会滞后。
- 备注3: 自己写代码截取html标签转化成NSMutableAttributedString,不会阻塞主线程。
.attributedText赋值显示多行问题
- UILabel、UIButton:不支持多段的富文本多行,单行支持
- 多段的富文本使用UITextView,UITextView可以完美解决上面问题
- 多段是指这个富文本中不只添加了一类属性,比如一些文案是红色、一些文案是黑色字体