【问题标题】:WKWebView not rendering correctly in iOS 10WKWebView 在 iOS 10 中无法正确呈现
【发布时间】:2017-01-25 17:20:33
【问题描述】:

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

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

它在 iOS 8 和 9 上运行良好。我在这里创建了一个示例项目来演示这种行为: https://github.com/pawin/strange-wkwebview

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

更新:iOS11 已解决此问题

【问题讨论】:

  • 你解决了吗?我有同样的问题
  • 我刚刚注意到内容中有图像时会发生这种情况
  • 我还没解决,你说如果网站只有文字就可以正常工作?
  • 是的,如果网站只有文字就可以了
  • 我也有同样的问题,所以我把tableView换成了collectionView,一切正常。希望有人能弄清楚 tableViewCell 和 WKWebView 有什么问题。

标签: wkwebview ios10


【解决方案1】:

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

// 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()
        }
    }
}

【讨论】:

  • 请编辑更多信息。不建议使用纯代码和“试试这个”的答案,因为它们不包含可搜索的内容,也没有解释为什么有人应该“试试这个”。
  • 谢谢!为我工作。看起来 wkwebview 并没有以某种方式将内容刷新到屏幕外。无论如何,我正在创建 Apple 其他票,因此可能会在下一个测试版中添加。它在 10.1 beta 5 中仍然失败。
  • 在scrollViewDidEndDecelerating委托方法中运行这段代码不是更好吗?
  • 过去很多天我一直在努力寻找这个解决方案!干得好!
  • 太棒了!!处理 webview 总是让人头疼。
【解决方案2】:
    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】:

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

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

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

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


    最终我意识到 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;
        }
    }
    

    【讨论】:

      【解决方案4】:

      在 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

      【讨论】:

        【解决方案5】:

        我也有带有 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)
           }
        }
        

        【讨论】:

          猜你喜欢
          • 2023-04-09
          • 1970-01-01
          • 2017-02-19
          • 1970-01-01
          • 2011-05-23
          • 2017-06-28
          • 2012-04-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多