UITextView和UILabel加載HTML

CUJAlison 8年前發布 | 48K 次閱讀 HTML Objective-C開發 UITextView

來自: 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>

 本文由用戶 CUJAlison 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!