UIWebView的测试URL:http://www.le.com/ptv/vplay/25955465.html#vid=25955465
什么?来了一个需求,需要快速支持论坛帖子内容富文本,并且多端打通?
OK => UIWebView搞定(需兼容至iOS7)
纳尼?要把评论拿出来,保持Native的体验?
OK => UIWebView + UITableView/UICollectionView
but,作为头部,webView的高度怎么确定?网上随处可见的四种方法:
- (void)webViewDidFinishLoad:(UIWebView *)webView {
CGFloat webViewHeight1 = [webView.scrollView contentSize].height;
NSLog(@"第一种方法:%f", webViewHeight1);
CGFloat webViewHeight2 = [[webView stringByEvaluatingJavaScriptFromString:@"document.body.offsetHeight"]floatValue];
NSLog(@"第二种方法:%f", webViewHeight2);
CGSize actualSize = [webView sizeThatFits:CGSizeZero];
NSLog(@"第三种方法:%f", actualSize.height);
CGFloat webViewHeight4 = 0.0f;
if([webView.subviews count] > 0)
{
UIView *scrollerView = webView.subviews[0];
if([scrollerView.subviews count] > 0) {
for (UIView *view in scrollerView.subviews) {
if ([view isKindOfClass:[NSClassFromString(@"UIWebBrowserView")class]]) {
webViewHeight4 = view.frame.size.height;
NSLog(@"第四种方法:%f", webViewHeight4);
}
}
}
}
}
当我用RAC代替KVO监测webView的contentSize时,打出的log却是类似这样:
2016-08-04 10:58:17.253 iOS7-UIWebView[5163:65505] 第一种方法:982.000000
2016-08-04 10:58:17.253 iOS7-UIWebView[5163:65505] 第二种方法:1.000000
2016-08-04 10:58:17.253 iOS7-UIWebView[5163:65505] 第三种方法:982.000000
2016-08-04 10:58:17.253 iOS7-UIWebView[5163:65505] 第四种方法:982.000000
2016-08-04 10:58:17.254 iOS7-UIWebView[5163:65505] webView.scrollView.contentSize => NSSize: {375, 982}
2016-08-04 10:58:17.419 iOS7-UIWebView[5163:65505] webView.scrollView.contentSize => NSSize: {375, 982}
2016-08-04 10:58:17.587 iOS7-UIWebView[5163:65505] webView.scrollView.contentSize => NSSize: {375, 948}
2016-08-04 10:58:17.735 iOS7-UIWebView[5163:65505] webView.scrollView.contentSize => NSSize: {375, 1936}
2016-08-04 10:58:18.110 iOS7-UIWebView[5163:65505] webView.scrollView.contentSize => NSSize: {375, 2425}
webView.scrollView.contentSize发生了多次变化,原因是网页内容的动态加载,滚动webView能发现网页内部分为多个板块,各自动态加载,尤其是评论部分十分明显,那么简单地在webViewDidFinishLoad:
代理内进行设置真的能解决问题么?我认为不能,因为在动态加载完成后(注意不是webView的request加载)webView.scrollView.contentSize发生变化时webViewDidFinishLoad:并不会被调用,也就是说webViewDidFinishLoad:无法接收到所有的contentSize变化。
如果是我的用法有误,请你不吝告诉我【正确的打开方式】。
我的思路
KVO => update webView's frame/constraints
Demo托管在Github:传送门