iOS 【奇巧淫技】获取webView内容高度
2017-06-22 本文已影响4161人
臭码农
针对获取webView高度问题之前写过一个方案——通过监听WebView的scrollView的变化来实时更新高度
附上链接: iOS【终极方案】精准获取webView内容高度,自适应高度
本文是给出第二种方案,解决网页内大量图片、动图导致的内容高度获取不准确:
直接上代码:
#pragma mark ————— 给每个Img标签添加JS事件 —————
-(void)webViewDidFinishLoad:(UIWebView *)webView
{
NSString *js = @"var imgs = document.getElementsByTagName(\"img\");"
"for(var i=0;i<imgs.length;i++){"
" var img = imgs[i];"
" img.onload=function(){window.location.href=('yourAppUrlSchemes://ImgLoaded');}"
"}";
//yourAppUrlSchemes 是在 info.plist - URL Types里设置的当前URL Schemes
[webView stringByEvaluatingJavaScriptFromString:js];
}
#pragma mark =============== 拦截webview的请求,获取网页中最后一个可视元素的位置 ===============
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
NSString *urlString = [[request URL] absoluteString];
urlString = [urlString stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSArray *urlComps = [urlString componentsSeparatedByString:@"://"];
NSLog(@"urlString=%@---urlComps=%@",urlString,urlComps);
if (urlComps.count==2&&[urlComps[1] isEqualToString:@"ImgLoaded"]) {
//imgload 图片加载完成,重新获取高度
CGSize fittingSize = [_webView sizeThatFits:CGSizeZero];
//此处我获取的是网页中倒数第三个标签的位置,可以根据要加载的网页结构设定取倒数第几个标签的位置可以代表整个网页高度
CGFloat lastHeight =[[_webView stringByEvaluatingJavaScriptFromString:@"document.getElementsByTagName(\"body\")[0].children[document.getElementsByTagName(\"body\")[0].children.length-3].offsetTop"] floatValue];
NSLog(@"webView:%@",NSStringFromCGSize(fittingSize));
_webView.frame = CGRectMake(0, 0, fittingSize.width, lastHeight);
[self.tableView beginUpdates];
[self.tableView setTableHeaderView:_webView];
[self.tableView endUpdates];
}
return YES;
}
上述思路是通过给每个img标签添加onload事件,事件执行内容就是给APP自身发送通知,APP在shouldStartLoadWithRequest 回调内截获将要发出的请求,并重新计算网页内容高度。
这是一个取巧的办法,不够灵活,实践证明能够解决固定结构的网页高度获取,对于不确定结构的网页,建议不要使用此方法,容易有误差。
大神们有解决这类问题的完美办法还望及时联系我,为了帮到更多人~
以上属于臭码农原创,若有雷同属巧合,如有错误望指正,转载请标明来源和作者。
by:臭码农