2016-12-01 48 views
10

Muszę zintegrować WKWebView z UITableView (proszę nie kwestionować tego).WKWebView nie wyświetla treści "pod ekranem"

Upewniłem się, że przewijanie WKWebView jest wyłączone, w ten sposób unikam przewijania widoku w przewijanym widoku (UITableView).

Jednak, gdy treść HTML w WKWebview jest duża, powiedzmy dwa razy ekran, okazuje się, że zawartość pod ekranem nie jest pokazywana użytkownikowi, tj. Kiedy użytkownik przewija widok tabeli jest tylko biały \ pusty ekran, gdzie WKWebView jest ...

zaktualizować wysokość WebViewTableViewCell według:

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

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

myślę, że to prawdopodobnie efekt jakiegoś optymalizacja WKWebView które pozwalają to uczynić DOM tylko kiedy są wyświetlane na ekranie.

Moje pytanie brzmi, co mogę zrobić, aby upewnić się, że cała treść w WKWebView jest pokazywana użytkownikowi, gdy przewija widok tabeli?

P.S. UIWebView świadczy cała zawartość dobrze, wydaje się, że dzieje się tylko w WKWebView

patrz obrazek poniżej:

enter image description here

+0

Jak i kiedy ustawiasz ramkę/rozmiar strony internetowej? Jeśli zatrzymasz się w widoku debuggera, czy widoki mają odpowiedni rozmiar? – Wain

+0

Zobacz moje zmiany dotyczące zmiany rozmiaru komórki widoku z przeglądarki internetowej –

+0

'webView.scrollView.contentSize' może nie być dokładne w momencie opublikowania powiadomienia. Sugeruję dodanie obserwatora na ścieżce 'webView.scrollView.contentSize' keyPath, a następnie uaktualnienie rozmiaru komórki z tego miejsca. –

Odpowiedz

9

Można zadzwonić setNeedsLayout na WKWebView (Swift):

Uwaga ta jest Scrollview dla 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() 
    } 
} 

Zobacz WKWebView not rendering correctly in iOS 10

1

Upewnij się podczas aktualizowania wysokości komórek, TableViewCell nie jest przeładunek WebView. W przeciwnym razie utkniesz w nieskończonej pętli, a dziwne zachowanie i wysokość ponownie się zresetują.

var CGFloat : webViewHeight = 0.0 

// Śledź aktualną wysokość 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 
}