富文本问题 NSMutableAttributedString,NSAttributedString

需求

接口返回html角标的字符串,前端转化成NSMutableAttributedString去渲染

"text": "您有18张券可使用",
  1. 这样的需求一般都是文案比较短,但是变化频率高,且带样式
  2. app端需要转换成NSMutableAttributedString然后使用UILabel或者UIButton显示

遇到的坑

  1. 方案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赋值显示多行问题

  1. UILabel、UIButton:不支持多段的富文本多行,单行支持
  2. 多段的富文本使用UITextView,UITextView可以完美解决上面问题
  • 多段是指这个富文本中不只添加了一类属性,比如一些文案是红色、一些文案是黑色字体

你可能感兴趣的:(富文本问题 NSMutableAttributedString,NSAttributedString)