需求:
在页面中嵌套webView,需要webView按网页的实际大小显示
遇到的问题:
在
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation{ }
方法中,并不能够每次都准确的获取到网页加载成功后的实际大小
原因:
实现:
这里,我在tableView的headerView中嵌套一个WKWebView,用来显示完整的网页内容
<WKNavigationDelegate>
- (WKWebView *)webView {
if(_webView == nil) {
_webView = [[WKWebView alloc] init];
_webView.navigationDelegate = self;
_webView.frame = self.view.bounds;
[_webView sizeToFit];
}
return _webView;
}
//解析json数据
CKAGHtmlModel *htmlModel = [CKAGHtmlModel mj_objectWithKeyValues:self.detailModel.trendsPreview.trendsModel.content];
//baseUrl不能够为空,随便传入一个url
NSURL *url = [NSURL URLWithString:@"http://www.congacademy.com/"];
//htmlModel.html为解析出来的html代码
[self.webView loadHTMLString:htmlModel.html baseURL:url];
self.tableView.tableHeaderView = self.webView;
思路一:
在执行
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation{ }
方法的时候,虽然网页可能没有被完全加载出来,这个时候获取到的网页的大小不一定准确;我们可以在第一次调用- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation{ }
方法的时候,让webView重新载入一次网页数据。由于网页的数据上一次已经加载过了,再次加载会使用到里面的缓存,加载速度比第一次要快的多,而且这一次能够或得到网页的实际大小
{
BOOL _shouldReload;
}
_shouldReload = YES;
- (void)webViewDidFinishLoad:(UIWebView *)webView {
CGSize size = [self.webView sizeThatFits:CGSizeZero];
// 设置webView的高度,这里使用 sd_layout
self.webView.sd_layout.heightIs(size.height);
[self setupAutoHeightWithBottomView:self.webView bottomMargin:24];
[self layoutSubviews];
if (self.delegate && [self.delegate respondsToSelector:@selector(webViewFinishLoad:)]) {
[self.delegate webViewFinishLoad:webView];
}
// 第一次加载网页,_shouldReload = YES
if (_shouldReload) {
_shouldReload = NO;
// 重新加载一次网页数据
CKAGHtmlModel *htmlModel = [CKAGHtmlModel mj_objectWithKeyValues:self.preview.trendsModel.content];
NSURL *url = [NSURL URLWithString:@"http://www.congacademy.com/"];
[self.webView loadHTMLString:htmlModel.html baseURL:url];
}
}
思路二
通过重定向中给出的方法进行设置
网页重定向:http://www.jianshu.com/p/897e2d82ee43
思路三
UIWebView(未测试过)
float webViewHeight = [[webView stringByEvaluatingJavaScriptFromString: @"document.body.scrollHeight"] floatValue];
WKWebView(测试获得正确的高度)
[webView evaluateJavaScript:@"document.body.scrollHeight" completionHandler:^(id _Nullable result, NSError * _Nullable error) {
double webViewHeight = [result doubleValue];
}];
相关资料
iOS Webview自适应实际内容高度的4种方法详解
http://www.jb51.net/article/93254.htm