web-dev-qa-db-ja.com

iOS 10でWKWebViewが正しくレンダリングされない

UITableViewCell内にWKWebViewがあります。 Webビューのロードリクエスト。ロードが完了したら、Webビューの高さをコンテンツの高さと同じサイズに変更し、それに応じてテーブルビューのセルの高さを調整します。

何が起こったのかというと、Webビューは画面サイズに合った領域のみを表示していました。下にスクロールすると、すべてが白になります。しかし、正しい高さでレンダリングされたWebビューが表示され、Webビューの白い領域をタップアンドホールドすると、まだ選択が表示されます。ピンチでズームすると、画面に表示されるWebビュー領域が表示されますが、他の領域は白くなることがあります。

IOS 8および9で正常に動作します。ここでこの動作を示すサンプルプロジェクトを作成しました。 https://github.com/pawin/strange-wkwebview

オープンレーダー: https://openradar.appspot.com/radar?id=4944718286815232

更新:この問題はiOS11で解決されました

27
wint

WKWebViewがスクロールしている間に、UITableViewを強制的にレイアウトする必要があります。

// 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()
        }
    }
}
26
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()
}

最良の解決策ではありませんが、少なくともユーザーは残りのコンテンツを見ることができます

1
Sirait

Imには、wkWebViewのセルを含むuitableviewもあります。そして、私は同じ問題でスタックします。しかし、タイムリーにこのコードでこれを修正できます。パフォーマンスによって心配する必要はありません。 iphone 5sでこのソリューションをテストしましたが、目に見えるWebセルでuitableViewをスクロールした場合にのみ10-15%CPUを使用しました。

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

Objective-Cでは、これが問題の解決方法です。

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

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

このコードは、表示されているすべてのセルを収集し、ユーザースクロール中に高速列挙でsetNeedsLayoutを実行します。

0