在iOS原生界面有時會遇到需要使用或加入一部分webview模塊,我們知道在加載html文本后獲取webview高度可以通過以下方法
#pragma mark - KVO
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context {
if (_webView.estimatedProgress >= 1.0f) {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
CGFloat height = self.webView.scrollView.contentSize.height;
self.webView.height = height;
NSLog(@"height---%f",self.webView.scrollView.contentSize.height);
if (self.detailHieghtBlock) {
self.detailHieghtBlock(height+0.001);
}
});
}
}
來進行高度傳遞,但是在特定的需求下這個方式就不太夠用,比如
當需要修改 webview 的字體大小的時候,需要設置更新 webview 的 frame,這時候就會遇到常見的一個問題,就是當字體 從小到大 變化的時候是正常的,當字體 從大到小 變化的時候,webview 的高度不會變化,這樣就導致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(15, 0, kScreenWidth-30, webHeight);
}];
}
這時候我們可以在 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的高度了,無論字體從大到小還是從小到大,獲取的高度都是正確的。
知識點
解決該問題之后,需要了解下面關于 html 的知識點:
1、 body標簽
body 標簽的高度設定好之后,如果里面內容的高度大于 body 的高度,那么 body 會被撐開,高度發生變化,反之,body 的大小不會發生改變,高度自然也就是固定的了。
2、設置字體大小
document.getElementsByTagName('body')[0].style.webkitTextSizeAdjust= 100%
復制代碼
3、獲取body的高度
document.body.offsetHeight