美文网首页Objective-c
iOS获取webView内容高度不正确的问题

iOS获取webView内容高度不正确的问题

作者: 4335151e8554 | 来源:发表于2019-09-25 13:49 被阅读0次

    不论是UIWebView还是WKWebView,在tableViewCell中嵌套使用时都有可能出现问题,比如通过JS获取的H5页面内容高度和H5显示的实际高度不一样,有时候高有时候低有时候又正常,让人抓狂😩。

    本人在做H5图片懒加载时意识到问题可能出现在懒加载这里,因为图片没有下载好之前都是显示占位图片,而占位图片的高度是固定的(原图的高度可能不固定),有可能比原图高,有可能比原图窄,也可能一样高,一样高不会出现什么问题,前两种就会造成网页显示异常。

    第一种情况:占位图片的高度和原来图片的高度一样,那么不会有问题
    第二种情况:占位图片的高度比原来图片的高度小,那么此时JS获取到的高度会比实际高度要小,等图片下载完后页面就会被撑高,导致H5页面显示不全
    第三种情况:占位图片的高度比原来图片的高度大,那么此时JS获取到的高度会比实际高度要大,等图片下载完后页面就会变短,导致webView留出一段空白

    解决办法:使用KVO监听webView.scrollView的contentSize属性

    //添加观察者
    [wself.webview.scrollView addObserver:wself forKeyPath:@"contentSize" 
                                  options:NSKeyValueObservingOptionNew context:nil];
    

    图片下载好以后,contentSize属性会变化,也就是页面的实际高度会变化,这个时候使用最新的高度刷新cell的高度

    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object 
                            change:(NSDictionary<NSKeyValueChangeKey,id> *)change 
                           context:(void *)context{
        //由于图片在实时加载,监听到内容高度变化,需要实时刷新您的控件展示高度
        if([keyPath isEqualToString:@"contentSize"]) {
            //直接使用scrollView.contentSize.height来刷新cell高度,不再使用JS获取
            CGFloat height = self.webview.scrollView.contentSize.height;
    
     //定义一个属性保存高度,当上一次的高度等于这次的高度时就不要刷新cell了,不然cell会一直刷新
            if (self.contentHeight == height) {
                return ;
            }
            self.model.contentHeight = height;
    
            //刷新cell高度
            ...
        }
    }
    

    刷新cell时去除动画,否则tableview会上下跳动

    [UIView performWithoutAnimation:^{
         [self.tableview reloadRowsAtIndexPaths: withRowAnimation:UITableViewRowAnimationNone];
    }];
    

    最后记得移除KVO监听

    [self.webview.scrollView removeObserver:self forKeyPath:@"contentSize"];
    

    相关文章

      网友评论

        本文标题:iOS获取webView内容高度不正确的问题

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