UITableViewCell嵌套WKWebView

前言

今天一直在网上找如何在UITableViewCell嵌套WKWebView,问题还挺多了,最后还是在stackoverflow找到了解决方案,废话不多说,直接看解决方案。

正文

1. 构建WKWebView

        self.webView = [[WKWebView alloc] init];
        // 创建请求
        NSURLRequest *request =[NSURLRequest requestWithURL:[NSURL URLWithString:@"https://www.jianshu.com"]];
        // 加载网页
        [self.webView loadRequest:request];
        
        self.webView.scrollView.scrollEnabled = NO;
        self.webView.scrollView.bounces = NO;
        self.webView.scrollView.showsVerticalScrollIndicator = NO;
        self.webView.autoresizingMask = UIViewAutoresizingFlexibleHeight;
        
        // 将webView添加到界面
        [self.contentView addSubview:self.webView];

2. cell高度适应WKWebView的内容

cell.webView.navigationDelegate = self;

#pragma mark - WKNavigationDelegate
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation {
    
    [webView evaluateJavaScript:@"document.body.offsetHeight" completionHandler:^(id _Nullable result, NSError * _Nullable error) {
        // 计算webView高度
        self.webViewCellHeight = [result doubleValue];
        // 刷新tableView
        [self.tableView reloadData];
    }];
}

3. 解决加载空白问题

原因:由于WKWebView采用的lazy加载模式,所在的scrollView的滚动被禁用,导致被嵌套的WKCompositingView不进行数据加载。

详细细节请参考:WKWebView刷新机制小探

#pragma mark - UIScrollViewDelegate
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    // 判断webView所在的cell是否可见,如果可见就layout
    NSArray *cells = self.tableView.visibleCells;
    for (UITableViewCell *cell in cells) {
        if ([cell isKindOfClass:[TraitWebViewCell class]]) {
            TraitWebViewCell *webCell = (TraitWebViewCell *)cell;
            
            [webCell.webView setNeedsLayout];
        }
    }
    
}

你可能感兴趣的:(UITableViewCell嵌套WKWebView)