更新: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
网友评论
http://www.jianshu.com/p/6bbcc438b188
http://www.jianshu.com/p/6bbcc438b188
JSStr 传的是空吗?
```code-lang
blablabla
```
````obj
OC代码
````