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?
??