2016-12-01 110 views
10

我必须将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

+0

如何以及何时设置网页视图框/单元格大小?如果你停在视图调试器的视图所有正确的大小? – Wain

+0

查看我的关于如何调整webview单元格的编辑 –

+0

'webView.scrollView.contentSize'在发布通知时可能不准确。我建议在'webView.scrollView.contentSize' keyPath上添加一个观察者,然后从那里更新您的单元格大小。 –

回答

9

您可以拨打setNeedsLayout在WKWebView,(SWIFT):

注意:这是滚动视图的UITableView的。

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

确保当更新单元格高度,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 
}