美文网首页iOS Webview JS交互iOS干货ios学习资料
cell中 UIwebView的自适应高度和高性能的做法

cell中 UIwebView的自适应高度和高性能的做法

作者: Alice_Ace | 来源:发表于2015-11-12 18:05 被阅读6171次

       更新:7.优化,全局变量webview将首次计算的高度缓存起来.   随后cell也可以异步方式渲染出来。                  

    (适合对uiwebvieb有基本了解的读者)

    做法:在每一个tableview的cell里面嵌入uiwebview,即每一个cell里面有一个html

    难点:性能,自适应高度

    1.

    一般的做法是:

    *请求数据->加载UITableView->加载UIWebView->*重新计算并调整UIWebView及其行高。

    注意:

    1.webview加载—>刷新高度(刷新当前行tableview->reloadRowsAtIndexPaths)-->又重新加载webview,又重复刷新高度--》死循环(可以加载一次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;

    加载完了内容才能执行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:方法只执行一次。之后每次复用cell,webview时,就不用loadRequest,用stringByEvaluatingJavaScriptFromString去替换webview默认html里面的内容。

    5.加载5000条数据都很流畅,跟平常的tableview差不多。

    6.还是可以考虑另外一种做法:预加载的方式,当tableview滑动到底部时,先预加载后面几条,这样高度也先出来了 ,再去渲染cell.

    最后:,我学习ios有5个月喽~我是第一次写技术文章~谢谢阅读!欢迎技术交流(*^__^*)  -by Alice Ye

    相关文章

      网友评论

      本文标题:cell中 UIwebView的自适应高度和高性能的做法

      本文链接:https://www.haomeiwen.com/subject/rughhttx.html