? ?更新:7.優(yōu)化甸私,全局變量webview將首次計(jì)算的高度緩存起來. ? 隨后cell也可以異步方式渲染出來。 ? ? ? ? ? ? ? ? ?
(適合對(duì)uiwebvieb有基本了解的讀者)
做法:在每一個(gè)tableview的cell里面嵌入uiwebview,即每一個(gè)cell里面有一個(gè)html
難點(diǎn):性能,自適應(yīng)高度
1.
一般的做法是:
*請(qǐng)求數(shù)據(jù)->加載UITableView->加載UIWebView->*重新計(jì)算并調(diào)整UIWebView及其行高琴拧。
注意:
1.webview加載—>刷新高度(刷新當(dāng)前行tableview->reloadRowsAtIndexPaths)-->又重新加載webview蝌借,又重復(fù)刷新高度--》死循環(huán)(可以加載一次webview后拿到的高度跟當(dāng)前刷新加載的高度比較,若相等則不必?zé)o限刷新)吟吝;
2.如果每一行cell高度不一樣的話菱父,就很麻煩了,很耗性能剑逃,而且高度難以控制浙宜。
加載內(nèi)容
//加載網(wǎng)頁或者本地文件
- (void)loadRequest:(NSURLRequest *)request;
//直接加載html內(nèi)容,如果html中的圖片等資源在本地目錄蛹磺,注意將baseURL指向該目錄
- (void)loadHTMLString:(NSString *)string baseURL:(NSURL *)baseURL;
//功能與上面類似
- (void)loadData:(NSData *)data MIMEType:(NSString *)MIMEType textEncodingName:(NSString *)textEncodingName baseURL:(NSURL *)baseURL;
加載完了內(nèi)容才能執(zhí)行stringByEvaluatingJavaScriptFromString方法粟瞬。
2.
用autolayout控制高度webview的高度:
問題是:uiwebview里面包含一個(gè)UIScrollview,IB要求UIScrollview的contentSize必須在布局時(shí)能夠確定萤捆。
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里面包含著一個(gè)UIWebBrowserView用于渲染網(wǎng)頁內(nèi)容的焰轻,那樣的話只能用代碼寫約束了(~原諒我太懶了~所以沒這樣做~嘻嘻)
3.
我最后比較滿意的做法是:
- (CGFloat)tableView:(UITableView
*)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
NSString*str=[selfgetDataHtmlString:indexPath];
self.htmlHeight=[selfevaluateJSWithHtmlContent:_webView htmlstr:strJSstr:@""];
returnself.htmlHeight;
}
1.在tableviewController里面,當(dāng)渲染一行cell時(shí)昆雀,先在cell的高度方法里用先用一個(gè)全局變量_webView是渲染html辱志,用js把高度計(jì)算出來蝠筑,然后再去渲染cell.
2.我沒有用loadRequest,loadHTMLString的異步方法去加載html,直接使用了同步方法stringByEvaluatingJavaScriptFromString去替換webview默認(rèn)html里面的內(nèi)容揩懒。
3.一個(gè)cell類是有一個(gè)uiwebview的屬性的什乙,當(dāng)cell復(fù)用時(shí),uiwebview也是復(fù)用的已球。
4.如果你想通過一個(gè)本地的html作為模板去渲染html的話臣镣,方便直接在本地加css,js的話智亮,可以在cell里面控制uiwebview的方法loadRequest:方法只執(zhí)行一次忆某。之后每次復(fù)用cell,webview時(shí),就不用loadRequest阔蛉,用stringByEvaluatingJavaScriptFromString去替換webview默認(rèn)html里面的內(nèi)容弃舒。
5.加載5000條數(shù)據(jù)都很流暢,跟平常的tableview差不多状原。
6.還是可以考慮另外一種做法:預(yù)加載的方式聋呢,當(dāng)tableview滑動(dòng)到底部時(shí),先預(yù)加載后面幾條颠区,這樣高度也先出來了 削锰,再去渲染cell.
最后:,我學(xué)習(xí)ios有5個(gè)月嘍~我是第一次寫技術(shù)文章~謝謝閱讀毕莱!歡迎技術(shù)交流(*^__^*) ?-by Alice Ye