美文网首页专注iOS开发Swift&Objective-Cios实用开发技巧
UIWebView和WKWebView加载网页获取内容高度

UIWebView和WKWebView加载网页获取内容高度

作者: 皮乐皮儿 | 来源:发表于2016-10-25 12:10 被阅读7186次

    UIWebView获取网页高度

    > 方法一
    根据webview内嵌的scrollView的contentSize.height去计算高度:
    -(void)webViewDidFinishLoad:(UIWebView *)webView {
    
        CGFloat height = 0.0;
        [webView sizeToFit];
        height = webView.scrollView.ContentSize.height;
        CGRect webFrame = webView.frame;
        webFrame.size.height = height;
        webView.frame = webFrame;
    }
    
    > 方法二
    -(void)webViewDidFinishLoad:(UIWebView *)webView {
    
        CGFloat height = [[webView stringByEvaluatingJavascriptFromString:@"document.body.offsetHeight"] floatValue];
        //ps:js可以是上面所写,也可以是document.body.scrollHeight;个人觉得两者在UIWebView中都可以,但是在WKWebView中就不同了,后面会有介绍
        CGRect webFrame = webView.frame;
        webFrame.size.height = height;
        webView.frame = webFrame;
    }
    
    > 方法三:遍历UIWebView的所有子视图,找到中间的UIWebViewScrollView或者UIWebBrowserVeiw,获取到它的frame设定给webView
    -(void)webViewDidFinishLoad:(UIWebView *)webView {
         if(webView.subViews.count > 0) {
         for(UIView *view in webView.subViews) {
        // if([view iskindOfClass:NSClassFromString:@"UIWebViewScrollView"]){
      //   webView.frame = view.frame;
       //  }
               UIScrollView *scrollView = webView.subViews[0];
              for (UIView *view in scrollView.subViews) {
              if([view iskindOfClass:NSClassFromString:@"UIWebBrowserVeiw"]){
               webView.frame = view.frame;
             }
          }
       }
     }
    
    

    ps:经过验证,以上三种方法都是可行的,但是会出现一个问题,有的时候依然获取不到高度,或者高度不正确,这个时候有一个处理方法,是在didFinishLoad里面第一次获取之后隔一到两秒再获取一次,就可以获取到了,至于原因,我也不知道。

    WKWebView获取内容高度

    > 方法一
    - (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation {
     CGFloat height = 0.0;
        [webView sizeToFit];
        height = webView.scrollView.ContentSize.height;
        CGRect webFrame = webView.frame;
        webFrame.size.height = height;
        webView.frame = webFrame;
    
    }
    
    > 方法二
    - (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation {
     [webView evaluateJavaScript:@"document.body.offsetHeight" completionHandler:^(id data, NSError * _Nullable error) {
      CGFloat height = [data floatValue];
        //ps:js可以是上面所写,也可以是document.body.scrollHeight;在WKWebView中前者offsetHeight获取自己加载的html片段,高度获取是相对准确的,但是若是加载的是原网站内容,用这个获取,会不准确,改用后者之后就可以正常显示,这个情况是我尝试了很多次方法才正常显示的
        CGRect webFrame = webView.frame;
        webFrame.size.height = height;
        webView.frame = webFrame;
    }];
      
    }
    
    > 方法三:遍历WKWebView的所有子视图,找到中间的WKContentView,获取到它的frame设定给webView
    - (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation{
         if(webView.subViews.count > 0) {
         for(UIView *view in webView.subViews) {
         
              if([view iskindOfClass:NSClassFromString:@"WKContentView"]){
              webView.frame = view.frame;
              }
       }
    

    ps:两种webview的第三种方法需要自己打印出来webView.subViews去观察一下,有很大不同,前两种方法是比较常用的,一般情况下能满足要求,特别一点是:我在做项目的时候发现,有时候第一次获取高度是获取不到的,这个时候我就强制在第一次获取之后隔1s再去获取一次,刷新webView,这个时候就能获取到了

    当然这只是我在做项目的过程中所遇到的问题,并多次尝试解决的,也不一定适合所有的情况,若是有别的情况,或者有更多更好的方法欢迎交流学习

    相关文章

      网友评论

      • LD_左岸:> 方法一
        - (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation {
        CGFloat height = 0.0;
        [webView sizeToFit];
        height = webView.scrollView.ContentSize.height;
        CGRect webFrame = webView.frame;
        webFrame.size.height = height;
        webView.frame = webFrame;

        }

        我也是这么写的 但是当切换链接时 获取到的高度就不对了 比如现在加载http://1 他内容的真实高度是1000 然后我在加载http://2他的真实高度是100 但是以上方法得到的是1000
        LD_左岸:@顾语流年
        [webView sizeToFit];
        [webView setNeedsLayout];
        [webView layoutIfNeeded];
        都不成 我在加载第二个链接的时候 把self.webView = nil
        解决了大部分情况下 获取到的高度不准确的问题
        皮乐皮儿:@左岸__ 这个应该是webview内部刷新机制,还没有及时更改调scrollView的contentSize,你试试切换链接加载后,webview setLayoutIfNees一下行不行,切换获取的情形我没遇到过
        LD_左岸:iOS11一下
      • HeavenWong:应该是跟网络有关, 部分延迟加载

      本文标题:UIWebView和WKWebView加载网页获取内容高度

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