前言
项目中有个需求是一行文字,想使用后台控制显示,比如说一个价钱的label,有的时候先想显示成:”100元/本“或者“免费”,而且显示100元的时候要加粗变红。
当时随即想到的思路是使用UILabel或者UITextview来展示html代码,但是这样,会消耗大量的性能,具体看一下分析
使用UILable加载html的代码如下:
//UILabel
priceLabel.text = model.money_type;
NSAttributedString *attributeString = [[NSAttributedString alloc] initWithData:[priceLabel.text dataUsingEncoding:NSUnicodeStringEncoding] options:@{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType } documentAttributes:nil error:nil];
priceLabel.attributedText = attributeString;
使用UITextView加载html的代码如下:
//UITextView
UITextView *a = [[UITextView alloc]initWithFrame:CGRectMake(0, 50, self.view.frame.size.width-60, 100)];
a.backgroundColor = [UIColor yellowColor];
a.userInteractionEnabled = NO;
a.scrollEnabled = NO;
a.textContainerInset = UIEdgeInsetsMake(-5, -5, -5, -5);
a.text =@"<div style='font-size:30px;'>#29天魔鬼训练营#
</div><div style='color:red;'>初三在老家和嫂子、侄女一起看了《唐人街探案2》,电影院里人很多,上座超过90%。我对国产电影一向有偏见,更多爱看国外的片子,但这部电影还是让我有点喜欢,大概写写自己的感受。
</div><div>
</div><div>先说说剧情。富豪孙子被杀,为争夺500万美金的破案费,全世界的各路私人侦探、纽约警察聚集纽约唐人街。电影帷幕就此拉开。
</div><div>
</div><div>";
NSAttributedString *att = [[NSAttributedString alloc]initWithData:[a.text dataUsingEncoding:NSUnicodeStringEncoding] options:@{NSDocumentTypeDocumentOption:NSHTMLTextDocumentType} documentAttributes:nil error:nil];
a.attributedText = att;
[self.view addSubview:a];
但是有时候会有问题,就是阻塞app,可能导致黑屏
原因是:NSAttributedString的initWithData是个非常耗时的操作,为了解决这个问题就想到,将创建NSAttributedString的代码放到子线程中实现,然后回到主线程中更新UI
代码如下(label为例子):
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSString *discountDesc = _reservationModel.promotionModel.discount_fee_desc;
NSAttributedString *hintAttributedString = [[NSAttributedString alloc] initWithData:[discountDesc dataUsingEncoding:NSUnicodeStringEncoding] options:@{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType} documentAttributes:nil error:nil];
dispatch_async(dispatch_get_main_queue(), ^{
priceLabel.attributedText = hintAttributedString;
priceLabel.numberOfLines = 0;
priceLabel.font = [UIFont systemFontOfSize:14];
priceLabel.textAlignment = NSTextAlignmentCenter;
});
});
但是经过测试NSAttributedString 的初始化在iOS8.3以下不能放在放在子线程里初始化,否则App会崩溃,而在iOS8.3及以上是可以放在子线程中初始化,然后回到主线程刷新UI的
所以尽量不使用这些加载html
网友评论