cell中 UIwebView的自適應高度和高性能的做法

? ?更新: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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容