背景
iOS开发过程中,当我们需要修改
webview的字体大小的时候,需要设置更新 webview 的frame,这时候就会遇到常见的一个问题,就是当字体 从小到大 变化的时候是正常的,当字体 从大到小 变化的时候,webview 的高度不会变化,这样就导致webview的底部一大片的空白,经过多次的探索与询问,我终于找到了的该问题的根源。
知识点
了解该问题之前,需要了解下面关于 html 的知识点:
1、 body标签
body 标签的高度设定好之后,如果里面内容的高度大于 body 的高度,那么 body 会被撑开,高度发生变化,反之,body 的大小不会发生改变,高度自然也就是固定的了。
2、设置字体大小
document.getElementsByTagName('body')[0].style.webkitTextSizeAdjust= 100%
3、获取body的高度
document.body.offsetHeight
代码实现
1、错误的获取webview内容高度的方法
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation {
__weak typeof(self) weakSelf = self;
[webView evaluateJavaScript:@"document.body.offsetHeight" completionHandler:^(id _Nullable m, NSError * _Nullable error) {
CGFloat webHeight = [m floatValue];
webView.frame = CGRectMake(KAdapter(5), 0, kScreenWidth, webHeight);
}];
}
2、正确的获取webview内容高度的办法
在 body标签内部再套一层标签,如下所示:
<body><div id='bodybox'></div></body>
然后获取div的高度:
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation {
__weak typeof(self) weakSelf = self;
[webView evaluateJavaScript:@"document.getElementById('bodybox').offsetHeight" completionHandler:^(id _Nullable m, NSError * _Nullable error) {
CGFloat webHeight = [m floatValue];
webView.frame = CGRectMake(0, 0, kScreenWidth, webHeight);
}];
}
按照这个办法来做的话,就可以准确的获取到webview的高度了,无论字体从大到小还是从小到大,获取的高度都是正确的。