简明的讲 WKWebView获取内容高度的方式 大概其有三种 无外乎
1.通过在加载完成的代理方法中执行js获取内容高度
2.通过KVO去监听webView.scrollView的contentsize属性获取
3.直接了当的在加载完成的代理方法中获取 楼主就是用的这么直接了当的方式
直面遇见的问题是:
- 首先在iOS11上是OK的
- 在iOS11以下的系统不OK
实现的功能是: 有五个按钮 对应五个不同的链接 点击按钮 切换wkwebview上展示的东西 获取每个不同链接的内容的真实高度
代码实现:
// 页面加载完成之后调用
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation
{
[_hud hideAnimated:YES];
CGFloat H = webView.scrollView.contentSize.height;
LDLog(@"webview加载完成之后内容的高度 = ...%f...",H);
LDLog(@"webview加载的URL为 = %@",webView.URL);
self.tablViewHight = H;
self.webView.xmg_height = self.tablViewHight;
}
webview加载完成之后内容的高度 不准确 表现为 如果我先加载的链接1 他的内容高度为1341像素 OK 是正确的
我接着再点链接2 链接2实际真实的内容高度是354
但是打印出来确是1341
如果反过来 我先点链接2也就是内容短的 再点链接1
都OK
初步解决方案是
- (void)btnClick:(UIButton*)btn
{
if (btn.tag == 0) {
self.webView = nil;
NSURLRequest * request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://xxxxxx="]];
[self.webView loadRequest:request];
}else if (btn.tag == 1){
self.webView = nil;
NSURLRequest * request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://xxxxxxx="]];
[self.webView loadRequest:request];
}else if (btn.tag == 2){
self.webView = nil;
NSURLRequest * request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://xxxxx="]];
[self.webView loadRequest:request];
}
}
这样在完成加载的代理中拿到的内容高度就是本链接对应的内容的真实高度了
然儿 楼主在测试的时候发现效果并不理想 也就是在加载链接2时 有时候还会返回给你链接1的高度
也就是还是会存在拿到的链接高度不准确的事情
另人百思不得其解!
楼主尝试了清理WK缓存 在没点链接2之前及早把wk赋值为nil都不行
最终采取了个 不怎么光明正大的方式解决了
self.webView = nil;
NSURLRequest *request2 =[NSURLRequest requestWithURL:[NSURL URLWithString:@""]];
self.tableView.userInteractionEnabled = NO;
[self.webView loadRequest:request2];
NSURLRequest *request =[NSURLRequest requestWithURL:[NSURL URLWithString:vm.remarks]];
self.tableView.userInteractionEnabled = NO;
[self.webView loadRequest:request];
通过每次切换链接之前 先加载一个空链接 来根除 第一次的链接不会对第二次链接的高度获取造成影响.