2016-12-01 109 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 
}