2016-12-01 3 views
10

Мне нужно интегрировать WKWebView внутри UITableView (просьба не спрашивать об этом).WKWebView не показывает содержимое «под экраном»

Я убедился, что прокрутка WKWebView отключена, поэтому я не вижу прокручиваемого вида в прокручиваемом виде (UITableView).

Однако, когда содержимое HTML внутри WKWebview велико, скажем, дважды на экране, я обнаружил, что содержимое под экраном не отображается пользователю, то есть когда пользователь прокручивает табличный вид, есть только белый \ пустой экран, где 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):

Примечание это Scrollview для 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

Это действительно Apple, оптимизация - оказывать только видимую часть веб-зрения. Есть несколько подобных вопросов об этой проблеме:

WKWebView screenshot not completely rendering full page height

How to capture a full page screenshot of WKWebview?

Попытки вызвать [self.webView setNeedsDisplay] в scrollViewDidScroll: методы представления таблицы делегата.

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 
} 
Смежные вопросы