在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 會被撐開,高度發(fā)生變化穷当,反之淹禾,body 的大小不會發(fā)生改變馁菜,高度自然也就是固定的了铃岔。
2汪疮、設置字體大小
document.getElementsByTagName('body')[0].style.webkitTextSizeAdjust= 100%
復制代碼
3毁习、獲取body的高度
document.body.offsetHeight