iOS WKWebView 修改字体大小,同时改变webView的高度

5,790 阅读1分钟

背景

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的高度了,无论字体从大到小还是从小到大,获取的高度都是正确的。