ios 三種方式載入本地HTMLString並計算高度
ios 原生控制元件載入本地HTMLString有三種方式:UILabel,UITextview,UIWebview;其中UILable,UITextview都是藉助於attributedText屬性載入富文字。
一:UILable 載入本地HTMLString
第一步:先把HTMLString 轉化為NSAttributedString:
- (NSAttributedString *)attributedStringWithHTMLString:(NSString *)htmlString
{
NSDictionary *options = @{ NSDocumentTypeDocumentAttribute : NSHTMLTextDocumentType,
NSCharacterEncodingDocumentAttribute :@(NSUTF8StringEncoding) };
NSData *data = [htmlString dataUsingEncoding:NSUTF8StringEncoding];
return [[NSAttributedString alloc] initWithData:data options:options documentAttributes:nil error:nil];
}
第二步:計算UIlable記載富文字之後的高度重置lable的frame;
CGFloat height = [self.lable.attributedText boundingRectWithSize:CGSizeMake(Device_Width, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin context:nil].size.height;//針對富文字有專門的計算動態高度的方法,與nsstring 大同小異;
self.lable.height = height;
二:UItextview 與UIlable 載入方式一樣也是通過上述方法計算高度
三:UIWebView載入本地HTMLString
以cell中巢狀UIWebView舉例,只舉例一個cell,如果多個cell,cell的高度還是要放在對應的model中儲存,否則會造成複用;
當cell中巢狀UIWebview 時,需要在返回高度的地方返回cell.height ,可是webview的高度只有在載入HTMLString之後調動結束載入HTMLString之後才能獲得UIWebview的高度,從而cell 的高度才能獲得。
首先,可以定義一個返回cell 高度的類變數,用靜態變數儲存,用來在webview載入完成之後重新儲存新的高度。
那麼問題來了, 只能在賦值之後webView載入HTMLString,執行代理方法,執行完之後需要重新返回cell 的高度,需要通知UITableview進行重新整理,然後就會出現死迴圈,所以增加判斷 staticHeight == height +1判斷,‘1’是contenview與cell 的分割線的高度。
最後總結下,如果是純HTMLString文字,可以使用UILable或者UItextview,(但是字型會小很多,相對於UIWebview載入來說,大神有知道的指點下),如果是帶有圖片的HTMLString,可以使用UIWebview進行載入;
demo地址:示例demo載入HTMLString
作者:雪_晟 連結:http://www.jianshu.com/p/9d4e31449e44 來源:簡書 著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。