开发中,一些地方用到webView需要根据其内容的多少来动态的计算高度并且自适应。但是往往获取到的高度并不是那么的精准,以至于布局错乱。
我们以往的做法是:在webView的回调方法webViewDidFinishLoad中获取网页内容高度,设置为webView的高度,调整webView布局。
实际上:webViewDidFinishLoad代理方法被调用时,页面并不一定完全展现完成,可能有图片还未加载出来,导致此时获取的高度是并不是最终高度,过会儿图片加载出来后,浏览器会重新排版,而我们在这之前给了一个错误高度,导致显示异常。
那么,如何能在webViewDidFinishLoad之后获取到网页内容高度的变化?
答案在此:给webView的scrollView的contentSize属性添加监听,每当内容发生变化,contentSize一定会跟着变,捕获这个变动,在监听方法中实现webViewDidFinishLoad中的代码,也就是获取最新的内容高度赋给webView:
添加观察者
[_webView addObserver:self forKeyPath:@"contentSize" options:NSKeyValueObservingOptionNew context:nil];
观察结果处理
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context{
if ([keyPath isEqualToString:@"contentSize"]) {
CGSize webViewSize = [_webView sizeThatFits:CGSizeZero];
_webView.frame = CGRectMake(0, 0, webViewSize.width, webViewSize.height);
}
}