? ?更新:7.優(yōu)化,全局變量webview將首次計算的高度緩存起來. ? 隨后cell也可以異步方式渲染出來。 ? ? ? ? ? ? ? ? ?
(適合對uiwebvieb有基本了解的讀者)
做法:在每一個tableview的cell里面嵌入uiwebview,即每一個cell里面有一個html
難點:性能,自適應高度
1.
一般的做法是:
*請求數(shù)據(jù)->加載UITableView->加載UIWebView->*重新計算并調整UIWebView及其行高。
注意:
1.webview加載—>刷新高度(刷新當前行tableview->reloadRowsAtIndexPaths)-->又重新加載webview,又重復刷新高度--》死循環(huán)(可以加載一次webview后拿到的高度跟當前刷新加載的高度比較,若相等則不必無限刷新);
2.如果每一行cell高度不一樣的話,就很麻煩了,很耗性能,而且高度難以控制。
加載內容
//加載網頁或者本地文件
- (void)loadRequest:(NSURLRequest *)request;
//直接加載html內容,如果html中的圖片等資源在本地目錄,注意將baseURL指向該目錄
- (void)loadHTMLString:(NSString *)string baseURL:(NSURL *)baseURL;
//功能與上面類似
- (void)loadData:(NSData *)data MIMEType:(NSString *)MIMEType textEncodingName:(NSString *)textEncodingName baseURL:(NSURL *)baseURL;
加載完了內容才能執(zhí)行stringByEvaluatingJavaScriptFromString方法。
2.
用autolayout控制高度webview的高度:
問題是:uiwebview里面包含一個UIScrollview,IB要求UIScrollview的contentSize必須在布局時能夠確定。
contentSize與UIScrollview的subViews相互依賴才能確定位置
之前看過一篇文章談到解決方法:讓subViews不依賴于contentSize,讓scrollview的contentview 與(scrollview所添加的)View的約束equal width,equal height。(http://natashatherobot.com/ios-autolayout-scrollview/)
但是:uiwebview里面的scrollview是封裝在里面的,在IB上不能以上的方法解決。只能通過去代碼遍歷uiwebview的subviews得到scrollview,scrollView里面包含著一個UIWebBrowserView用于渲染網頁內容的,那樣的話只能用代碼寫約束了(~原諒我太懶了~所以沒這樣做~嘻嘻)
3.
我最后比較滿意的做法是:
- (CGFloat)tableView:(UITableView
*)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
NSString*str=[selfgetDataHtmlString:indexPath];
self.htmlHeight=[selfevaluateJSWithHtmlContent:_webView htmlstr:strJSstr:@""];
returnself.htmlHeight;
}

1.在tableviewController里面,當渲染一行cell時,先在cell的高度方法里用先用一個全局變量_webView是渲染html,用js把高度計算出來,然后再去渲染cell.
2.我沒有用loadRequest,loadHTMLString的異步方法去加載html,直接使用了同步方法stringByEvaluatingJavaScriptFromString去替換webview默認html里面的內容。
3.一個cell類是有一個uiwebview的屬性的,當cell復用時,uiwebview也是復用的。
4.如果你想通過一個本地的html作為模板去渲染html的話,方便直接在本地加css,js的話,可以在cell里面控制uiwebview的方法loadRequest:方法只執(zhí)行一次。之后每次復用cell,webview時,就不用loadRequest,用stringByEvaluatingJavaScriptFromString去替換webview默認html里面的內容。
5.加載5000條數(shù)據(jù)都很流暢,跟平常的tableview差不多。
6.還是可以考慮另外一種做法:預加載的方式,當tableview滑動到底部時,先預加載后面幾條,這樣高度也先出來了 ,再去渲染cell.
最后:,我學習ios有5個月嘍~我是第一次寫技術文章~謝謝閱讀!歡迎技術交流(*^__^*) ?-by Alice Ye