iOS 【奇巧淫技】获取webView内容高度

针对获取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.οnlοad=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 回调内截获将要发出的请求,并重新计算网页内容高度。
这是一个取巧的办法,不够灵活,实践证明能够解决固定结构的网页高度获取,对于不确定结构的网页,建议不要使用此方法,容易有误差。
大神们有解决这类问题的完美办法还望及时联系我,为了帮到更多人~

作者:臭码农
链接:https://www.jianshu.com/p/e98e3747127c
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值