美文网首页ios
iOS使用UILabel和UITextview显示html的问题

iOS使用UILabel和UITextview显示html的问题

作者: MTSu1e丶 | 来源:发表于2018-03-27 18:17 被阅读321次

前言

项目中有个需求是一行文字,想使用后台控制显示,比如说一个价钱的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

相关文章

网友评论

    本文标题:iOS使用UILabel和UITextview显示html的问题

    本文链接:https://www.haomeiwen.com/subject/wjbscftx.html