美文网首页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