我在UITableViewCell中有WKWebView。 Web视图加载请求,然后在完成加载后,我将Web视图高度调整为等于其内容高度,然后调整表视图单元格高度以适应相应的。
网页视图只显示符合屏幕尺寸的区域。当我向下滚动时,一切都是白色的。但是我看到以正确的高度呈现的Web视图,点击并按住Web视图上的白色区域仍然可以看到选择。使用缩放进行缩放可使屏幕上显示的Web视图区域可见,但其他区域有时会变为白色。
它在iOS 8和9上运行正常。我已经创建了一个示例项目来演示此行为: https://github.com/pawin/strange-wkwebview
打开雷达: https://openradar.appspot.com/radar?id=4944718286815232
答案 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
。