当前位置: 首页>移动开发>正文

iOS中获取UIWebView的高度,当嵌套在UITableView中。

在实际开发中,经常碰见用富文本来展示内容,但有时候并不是整个界面都是富文本,这就出现半原生半富文本。这时候就需要使用UITableView嵌套UIWebView,把UIWebView添加到cell里面来展示。唯一需要解决的问题就是监控UIWebView的高度。下面讲述两种方法来监控高度。

一、在webViewDidFinishLoad方法里进行监控

   CGFloat height = [[self.webView stringByEvaluatingJavaScriptFromString:@"document.body.offsetHeight"] floatValue];
   self.webView1.frame = CGRectMake(self.webView1.frame.origin.x,self.webView1.frame.origin.y, SWidth, height+20);  
    [self.tableView reloadData];

这种方法有时候会出现计算偏差,导致你的网页被砍掉了一部分,没有显示出来。原因是由于网页有包含大量图片,当webView加载完成的时候,其实并没有把图片加载出来,也就是说调用webViewDidFinishLoad这个方法的时候,其实网页里面图片还没有加载出来。导致图片的高度并没有计算出来。所以导致计算出现偏差。方法二就解决了这个问题。

二、通过KVO(键值监听机制)进行监控高度

首先我们要注册观察者

 [_webView.scrollView addObserver:self forKeyPath:@"contentSize" options:NSKeyValueObservingOptionNew context:nil];

其次我们实现其代理方法

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context {
if ([keyPath isEqualToString:@"contentSize"]) {
        CGSize fittingSize = [_webView sizeThatFits:CGSizeZero];
        NSLog(@"webview %@",NSStringFromCGSize(fittingSize));
        CGRect webFrame = _webView.frame;
        webFrame.size.height = fittingSize.height;
        _webView.frame = webFrame;
        [self.webTableView reloadData];
    }
}

最后记得移除观察者

[self.webView removeObserver:self forKeyPath:@"contentSize"];

这样就可以完美解决UIWebView高度问题。

希望能帮助到你。

Best regards

Roger


https://www.xamrdz.com/mobile/4cc1848705.html

相关文章: