在实际开发中,经常碰见用富文本来展示内容,但有时候并不是整个界面都是富文本,这就出现半原生半富文本。这时候就需要使用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
网友评论