web-dev-qa-db-fra.com

WKWebView ne s'affiche pas correctement dans iOS 10

J'ai WKWebView à l'intérieur de UITableViewCell. La demande de chargement de la vue Web, puis, une fois le chargement terminé, redimensionne la hauteur de la vue Web afin qu'elle soit égale à la hauteur de son contenu, puis ajuste la hauteur des cellules de la vue du tableau pour l'adapter en conséquence.

Ce qui s’est passé est que la vue Web n’affiche que la zone adaptée à la taille de l’écran. Quand je fais défiler, tout est blanc. Mais je vois que la vue Web rendue avec la hauteur correcte, maintenez le doigt appuyé sur la zone blanche de la vue Web, voyez toujours la sélection. Le zoom avec pincement rend visible la zone d'affichage Web affichée à l'écran, mais d'autres zones deviennent parfois blanches.

Cela fonctionne très bien sur iOS 8 et 9. J'ai créé un exemple de projet pour illustrer ce problème ici: https://github.com/pawin/strange-wkwebview

Radar ouvert: https://openradar.appspot.com/radar?id=4944718286815232

Mise à jour: Ce problème est résolu dans iOS11.

27
wint

Vous devez forcer la WKWebView à la disposition pendant que votre UITableView défile.

// in the UITableViewDelegate
func scrollViewDidScroll(scrollView: UIScrollView) {
    if let tableView = scrollView as? UITableView {
        for cell in tableView.visibleCells {
            guard let cell = cell as? MyCustomCellClass else { continue }
            cell.webView?.setNeedsLayout()
        }
    }
}
24
ETHAN
    func reloadWKWebViewIfNeeded() {
    for cell in self.tableView.visibleCells {
        guard let webviewCell = cell as? WebviewCell else { continue }

        // guard cell height > screen height

        webviewCell.webview.reload()
    }
}

override func scrollViewDidEndDragging(scrollView: UIScrollView, willDecelerate decelerate: Bool) {
    guard !decelerate else { return }

    self.reloadWKWebViewIfNeeded()
}

override func scrollViewDidEndDecelerating(scrollView: UIScrollView) {
    self.reloadWKWebViewIfNeeded()
}

Pas la meilleure solution cependant, mais au moins l'utilisateur peut voir le reste du contenu

1
Sirait

J'ai aussi uitableview avec cellule avec wkWebView. Et j'empile avec le même problème. Mais en temps opportun, vous pouvez résoudre ce problème avec ce code. Par performance ne vous inquiétez pas. J'ai testé cette solution sur l'iphone 5s et il a été pris 10-15% de CPU uniquement lorsque vous faites défiler uitableView avec cellule Web visible.

func scrollViewDidScroll(_ scrollView: UIScrollView) {
   //TODO: Remove this fix when WKWebView will fixed
   if let cell = tableView.cellForRow(at: IndexPath(row: 1, section: 0)) as? WKWebViewCell {
      // Here we take our cell
      cell.wkWebView?.setNeedsLayout() 
      // here is "magic" (where wkWebView it is WKWebView, which was 
      // previously added on cell)
   }
}
0
Pavel Kandziuba

En objectif C, voici comment résoudre le problème.

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    NSArray * visibleCell = [self.tableView visibleCells];

    for (CustomUITableViewCell * cell in visibleCell) {
        if ([cell isKindOfClass:[CustomUITableViewCell class]]) {
            [cell.wkWebView setNeedsLayout];
        }
    }
}

Ce code va collecter toutes les cellules visibles et faire la setNeedsLayout en énumération rapide lors du défilement par l'utilisateur.

0
Raditya Kurnianto