项目遇到一个需求,一个页面上半部分是webView加载一个链接,下半部分是用户评论或者相关推荐,最好的方案就是tableView的tableHeaderView加载webView,这样滑动体验最好,下面讲一下方案关键点
webView高度获取
- 网上一般有两种方式,1. 在webview加载完成的代理方法里,通过执行获取html高度的JS 2. 给webview的scrollView的contentSize属性添加observer,我取的是第二种方式
- webView初始化
_webView =[[WKWebView alloc] initWithFrame:CGRectMake(0, 0, SCREENW, self.view.height) configuration:configuration];
_webView.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;
_webView.allowsBackForwardNavigationGestures = YES;// 浏览器内左右滑动,前进后退页面
_webView.navigationDelegate = self;
_webView.UIDelegate = self;
_webView.scrollView.scrollEnabled = NO;
[_webView addObserver:self forKeyPath:@"estimatedProgress" options:NSKeyValueObservingOptionNew context:nil];
[_webView.scrollView addObserver:self forKeyPath:@"contentSize" options:NSKeyValueObservingOptionNew context:nil];
if(@available(iOS 11.0, *)) { //重点
_webView.scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
}
- 初始化tableView, 一定要加上
if (@available(iOS 11, *)) {
self.tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
}
self.automaticallyAdjustsScrollViewInsets = NO;
webView作为tableView的tableHeaderView
- observer观察方法中获取webView真实高度,注意在tableView的滑动过程中,这个方法会持续执行,所以判断高度没变化就返回,不反复重置tableHeaderView
// 计算wkWebView高度,
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
if(object == self.webView.scrollView && [keyPath isEqualToString:@"contentSize"]){
CGFloat webViewHeight = _webView.scrollView.contentSize.height;
if (webViewHeight == self.webView.height) {
return;
}
CGRect newFrame = _webView.frame;
newFrame.size.height = webViewHeight;
_webView.frame = newFrame;
[_webView sizeToFit];
[self.tableView setTableHeaderView:self.webView];//这句话才是重点
[self.tableView reloadData];
}
}