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. 解决加载空白问题
【UITableViewCell嵌套WKWebView】原因:由于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]; } }}

    推荐阅读