UITextView和UILabel加載HTML
來自: http://www.henishuo.com/uitextview-uilabel-load-html/
前言
最近有不少朋友們、群友們經常問到UITextView如何加載HTML?UILabel能加載HTML嗎?或者問后臺接口返回來的是HTML格式的數據,我該怎么顯示呢?怎么處理呢?
在這里,筆者針對這些朋友、群友們的反饋,嘗試寫了個小demo,希望能夠幫助到大家吧!
Demo效果截圖
這demo中是放在cell里面加載的,并且教大家如何自動計算行高。不過UITextView計算行高是有誤差的,因為筆者沒有使用更高級的處理,直接使用了sizeThatFits這個API來計算高度。而UITextView天生就不一樣,它有上、下、左、右的間隔的,因此計算出來是有一點小偏差的。
本篇文章只講如何加載,不講如何精確計算!
使用到NSAttributedString
通過它就可以設置加載HTML。但是,要讓UILabel可以加載HTML,要求在iOS7之后才可以使用:
- (nullableinstancetype)initWithData:(NSData *)dataoptions:(NSDictionary<NSString *, id> *)optionsdocumentAttributes:(NSDictionary<NSString *, id> * __nullable* __nullable)dicterror:(NSError **)errorNS_AVAILABLE(10_0, 7_0);
其中,options中的指定key為:
UIKIT_EXTERN NSString * const NSDocumentTypeDocumentAttribute NS_AVAILABLE(10_0, 7_0);
時,它可以選擇的值有:
UIKIT_EXTERN NSString * const NSPlainTextDocumentType NS_AVAILABLE(10_0, 7_0); UIKIT_EXTERN NSString * const NSRTFTextDocumentType NS_AVAILABLE(10_0, 7_0); UIKIT_EXTERN NSString * const NSRTFDTextDocumentType NS_AVAILABLE(10_0, 7_0); UIKIT_EXTERN NSString * const NSHTMLTextDocumentType NS_AVAILABLE(10_0, 7_0);
其中,NSHTMLTextDocumentType就是設置要加載HTML了。
UILabel加載HTML
UILabel在iOS6.0后提供了一個屬性用于設置各種呈現的樣式:
@property(null_resettable,copy) NSAttributedString *attributedText NS_AVAILABLE_IOS(6_0);
雖然attributedText屬性是iOS6就可以使用,但是對于加載HTML,要求是在iOS7以上才能使用:
// ios 7.0以后才能使用 NSData *data = [model.htmldataUsingEncoding:NSUnicodeStringEncoding]; NSDictionary *options = @{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType}; NSAttributedString *html = [[NSAttributedString alloc]initWithData:data options:options documentAttributes:nil error:nil]; self.htmlLabel.attributedText = html;
UITextView加載HTML
UITextView也提供了相關設置文本樣式的屬性:
@property(null_resettable,copy) NSAttributedString *attributedText NS_AVAILABLE_IOS(6_0);
與UILabel類似,雖然attributedText屬性是iOS6就可以使用,但是對于加載HTML,要求是在iOS7以上才能使用:
// ios 7.0以后才能使用 NSData *data = [model.htmldataUsingEncoding:NSUnicodeStringEncoding]; NSDictionary *options = @{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType}; NSAttributedString *html = [[NSAttributedString alloc]initWithData:data options:options documentAttributes:nil error:nil]; self.textView.attributedText = html; // 加載HTML后,還要設置行高約束,否則高度就是0 CGFloat screenWidth = [UIScreen mainScreen].bounds.size.width; [self.textViewmas_updateConstraints:^(MASConstraintMaker *make) { make.height.mas_equalTo([self.textViewsizeThatFits:CGSizeMake(screenWidth - 20, CGFLOAT_MAX)].height); }];
在加載好HTML后,也要設置其高度,但是要注意,sizeThatFits:這個API計算UITextView的高度是不精準的,有一定的誤差。
最后
順便說一下,屬性中指定的類型null_resettable是什么鬼?這是新特性啦,從英文角度看就大概可以看出來意思是 可空、可重新設置值 。
源代碼
大家只可以下載本篇文章中所關聯的小demo,僅供參考!
下載地址: CoderJackyHuang 歡迎關注筆者的GITHUB地址,關注標哥的技術博客!
關注我
關注 | 賬號 | 備注 |
---|---|---|
Swift/ObjC技術群一 | 324400294 | 群一若已滿,請申請群二 |
Swift/ObjC技術群二 | 494669518 | 群二若已滿,請申請群三 |
Swift/ObjC技術群三 | 461252383 | 群三若已滿,會有提示信息 |
關注微信公眾號 | iOSDevShares | 關注微信公眾號,會定期地推送好文章 |
關注新浪微博賬號 | 標哥Jacky | 關注微博,每次發布文章都會分享到新浪微博 |
關注標哥的GitHub | CoderJackyHuang | 這里有很多的Demo和開源組件 |
關于我 | 進一步了解標哥 | 如果覺得文章對您很有幫助,可捐助我! |
版權聲明:本文為【標哥的技術博客】原創出品,歡迎轉載,轉載時請注明出處!
</div>