tableHeaderView是WKWebView的情况

项目遇到一个需求,一个页面上半部分是webView加载一个链接,下半部分是用户评论或者相关推荐,最好的方案就是tableView的tableHeaderView加载webView,这样滑动体验最好,下面讲一下方案关键点

webView高度获取
  • 网上一般有两种方式,1. 在webview加载完成的代理方法里,通过执行获取html高度的JS 2. 给webview的scrollView的contentSize属性添加observer,我取的是第二种方式
    1. 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;
}
    1. 初始化tableView, 一定要加上
if (@available(iOS 11, *)) {
   self.tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
}
self.automaticallyAdjustsScrollViewInsets = NO;

webView作为tableView的tableHeaderView

    1. 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];
    }
}

你可能感兴趣的:(tableHeaderView是WKWebView的情况)