29 votes

WKWebView ne s'affiche pas correctement dans iOS 10

J'ai WKWebView à l'intérieur de la UITableViewCell. La vue web de charge demande et puis après avoir fini de charger, je vais redimensionner l'affichage web de hauteur égale à la hauteur de son contenu, puis ajuster la vue de la table hauteur de cellule pour l'adapter en conséquence.

Ce qui s'est passé a la vue web n'affiche que la zone de l'adapter à la taille de l'écran. Quand je scroll vers le bas, tout est blanc. Mais je vois que le web afficher rendus avec une hauteur correcte, appuyez et maintenez le doigt sur la zone blanche sur le web à l'affichage de sélection. Zoom avec pincement rend le web zone d'affichage de l'affichage à l'écran visible, mais d'autres zones parfois devenir blanc.

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

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

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

28voto

ETHAN Points 256

Vous devez forcer le WKWebView à la mise en page 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()
        }
    }
}
 

1voto

Joey Points 11

J'ai le même problème - ajouter un WKWebView à un UITableViewCell, et j'ai résolu ce problème par ces étapes:

1.Créer un UITextView instance et l'ajouter à UITableView de superview(UIViewControllew.afficher) 2.mise en œuvre de codes dans scrollViewDidScroll comme ceci:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    [self.xxtextView becomeFirstResponder];
    [self.xxtextView resignFirstResponder];
}

Ces codes peuvent entraîner une augmentation des performances de l'uc les frais généraux, vous pouvez y remédier en quelque sorte, telles que l'utilisation d'une variable temp en tant que valeur de seuil.

Je ne pense pas que c'est un parfait résoudre méthode, mais cela fonctionne pour moi.


Finalement j'ai réalisé que textview becomeFirstResponder seulement mené la webview mise en page à nouveau, de sorte que vous pouvez résoudre le problème comme ceci:

CGFloat tempOffset = 0;

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    if (!tempOffset || ABS(scrollView.contentOffset.y - tempOffset) > ScreenHeight/2)
    {
        [self.wkWebView setNeedsLayout];
        tempOffset = scrollView.contentOffset.y;
    }
}

1voto

Sirait Points 11
     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()
}
 

Ce n'est pas la meilleure solution, mais au moins l'utilisateur peut voir le reste du contenu

0voto

Pavel Kandziuba Points 136

Im également 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 elle a été prise à 10-15% du processeur uniquement lorsque vous faites défiler uitableView avec une 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)
   }
}
 

0voto

Raditya Kurnianto Points 323

Dans l'objectif C, c'est ainsi que je résous 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 le setNeedsLayout en énumération rapide pendant le défilement de l'utilisateur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X