WKWebView没有在“屏幕下方”显示内容

时间:2016-12-01 15:13:27

标签: ios uitableview uiscrollview wkwebview

我必须在UITableView中集成WKWebView(请不要质疑)。

我确保禁用WKWebView滚动,这样我就避免在可滚动视图(UITableView)中有可滚动视图。

然而,当WKWebview中的HTML内容很大时,让我们说两次屏幕,我发现屏幕下方的内容没有显示给用户,即当用户滚动表格视图时,只有白色\空WKWebView的屏幕......

我根据以下内容更新了WebViewTableViewCell的高度:

public func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {

    let height = webView.scrollView.contentSize.height
    ...
    ...
    delegate.updateWebViewCellHeight(height: self.cellHeight)
}

我想这可能是对WKWebView进行一些优化的结果,它允许它只在屏幕上显示时才呈现DOM。

我的问题是,为了确保在滚动表格视图时向用户显示WKWebView中的所有内容,我该怎么办?

P.S。 UIWebView渲染所有内容都很好,它似乎只在WKWebView中发生

见下图:

enter image description here

3 个答案:

答案 0 :(得分:10)

你可以在WKWebView上调用setNeedsLayout,(Swift):

请注意,这是UITableView的scrollView。

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    // use IndexPath for row/section with your WKWebView
    if let cell = tableView.cellForRow(at: IndexPath(row: 1, section: 0)) as? WKWebViewCell { // Here we take our cell
        cell.wkWebView?.setNeedsLayout()
    }
}

请参阅WKWebView not rendering correctly in iOS 10

答案 1 :(得分:1)

这实际上是Apple优化 - 只渲染Web视图的可见部分。关于这个问题有几个类似的问题:

WKWebView screenshot not completely rendering full page height

How to capture a full page screenshot of WKWebview?

尝试在表格视图委托[self.webView setNeedsDisplay]方法中致电scrollViewDidScroll:

答案 2 :(得分:1)

确保在更新单元格高度时,TableViewCell不会重新加载WebView。否则你会陷入无限循环,奇怪的行为和高度会一次又一次地重置。

var CGFloat : webViewHeight = 0.0 

//跟踪webView的当前高度。

// MARK: - WKWebView Delegate
public func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {

    weak var weakSelf = self
    webView.evaluateJavaScript("document.documentElement.style.webkitUserSelect='none';") { (object : Any?, error : Error?) in

        if (error == nil) {
            let size : CGRect = self.heightForWebView(webView: webView)

            if (weakSelf.webViewHeight == 0.0 || size.height != weakSelf.webViewHeight){
                weakSelf.webViewHeight = size.height
            }

            webView.frame = size
            delegate.updateWebViewCellHeight(height: size.height)
        }
    }
}

// MARK: - WKWebView Heplper
func heightForWebView(webView : WKWebView)-> CGRect {
    var rect : CGRect = webView.frame as CGRect!
    rect.size.height = 1
    webView.frame = rect

    let newSize : CGSize = webView.sizeThatFits(CGSize.zero)
    rect.size = newSize

    return rect
}