UITableViewCell内にWKWebViewがあります。 Webビューのロードリクエスト。ロードが完了したら、Webビューの高さをコンテンツの高さと同じサイズに変更し、それに応じてテーブルビューのセルの高さを調整します。
何が起こったのかというと、Webビューは画面サイズに合った領域のみを表示していました。下にスクロールすると、すべてが白になります。しかし、正しい高さでレンダリングされたWebビューが表示され、Webビューの白い領域をタップアンドホールドすると、まだ選択が表示されます。ピンチでズームすると、画面に表示されるWebビュー領域が表示されますが、他の領域は白くなることがあります。
IOS 8および9で正常に動作します。ここでこの動作を示すサンプルプロジェクトを作成しました。 https://github.com/pawin/strange-wkwebview
オープンレーダー: https://openradar.appspot.com/radar?id=4944718286815232
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()
}
}
}
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()
}
最良の解決策ではありませんが、少なくともユーザーは残りのコンテンツを見ることができます
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)
}
}
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
を実行します。