WKWebView无法在iOS 10中正确呈现

时间:2016-09-17 16:26:53

标签: wkwebview ios10

我在UITableViewCell中有WKWebView。 Web视图加载请求,然后在完成加载后,我将Web视图高度调整为等于其内容高度,然后调整表视图单元格高度以适应相应的。

网页视图只显示符合屏幕尺寸的区域。当我向下滚动时,一切都是白色的。但是我看到以正确的高度呈现的Web视图,点击并按住Web视图上的白色区域仍然可以看到选择。使用缩放进行缩放可使屏幕上显示的Web视图区域可见,但其他区域有时会变为白色。

它在iOS 8和9上运行正常。我已经创建了一个示例项目来演示此行为: https://github.com/pawin/strange-wkwebview

打开雷达: https://openradar.appspot.com/radar?id=4944718286815232

更新:此问题已在iOS11中解决

5 个答案:

答案 0 :(得分:26)

您需要在WKWebView滚动时强制UITableView进行布局。

// in the UITableViewDelegate
func scrollViewDidScroll(scrollView: UIScrollView) {
    if let tableView = scrollView as? UITableView {
        for cell in tableView.visibleCells {
            guard let cell = cell as? MyCustomCellClass else { continue }
            cell.webView?.setNeedsLayout()
        }
    }
}

答案 1 :(得分:1)

我遇到同样的问题 - 将WKWebView添加到UITableViewCell,我通过以下步骤解决了这个问题:

1.创建一个UITextView实例并将其添加到UITableView的超级视图(UIViewControllew.view) 2. scrollViewDidScroll 中的实现代码如下:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    [self.xxtextView becomeFirstResponder];
    [self.xxtextView resignFirstResponder];
}

这些代码可能会导致cpu性能开销增加,您可以通过某种方式修复它,例如我们使用temp变量作为阈值。

我不认为这是一种完美的解决方法,但它对我有用。

最终我意识到textview becomeFirstResponder再次引领了webview布局,所以你可以像这样修复它:

CGFloat tempOffset = 0;

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    if (!tempOffset || ABS(scrollView.contentOffset.y - tempOffset) > ScreenHeight/2)
    {
        [self.wkWebView setNeedsLayout];
        tempOffset = scrollView.contentOffset.y;
    }
}

答案 2 :(得分:1)

    func reloadWKWebViewIfNeeded() {
    for cell in self.tableView.visibleCells {
        guard let webviewCell = cell as? WebviewCell else { continue }

        // guard cell height > screen height

        webviewCell.webview.reload()
    }
}

override func scrollViewDidEndDragging(scrollView: UIScrollView, willDecelerate decelerate: Bool) {
    guard !decelerate else { return }

    self.reloadWKWebViewIfNeeded()
}

override func scrollViewDidEndDecelerating(scrollView: UIScrollView) {
    self.reloadWKWebViewIfNeeded()
}

虽然不是最好的解决方案,但至少用户可以看到内容的其余部分

答案 3 :(得分:0)

我也有与wkWebView的单元格的uitableview。我堆叠同样的问题。但是及时你可以用这段代码解决这个问题。通过表现不用担心。我在iphone 5s上测试了这个解决方案,当你用可见的网络单元滚动uitableView时,它只占了10-15%的CPU。

func scrollViewDidScroll(_ scrollView: UIScrollView) {
   //TODO: Remove this fix when WKWebView will fixed
   if let cell = tableView.cellForRow(at: IndexPath(row: 1, section: 0)) as? WKWebViewCell {
      // Here we take our cell
      cell.wkWebView?.setNeedsLayout() 
      // here is "magic" (where wkWebView it is WKWebView, which was 
      // previously added on cell)
   }
}

答案 4 :(得分:0)

在Objective-C中,这就是我解决问题的方法。

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    NSArray * visibleCell = [self.tableView visibleCells];

    for (CustomUITableViewCell * cell in visibleCell) {
        if ([cell isKindOfClass:[CustomUITableViewCell class]]) {
            [cell.wkWebView setNeedsLayout];
        }
    }
}

该代码将收集所有可见单元格,并在用户滚动期间快速枚举setNeedsLayout