type - WKWebView no se procesa correctamente en iOS 10
wkwebview navigation swift (5)
En el objetivo C así es como resuelvo el problema.
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
NSArray * visibleCell = [self.tableView visibleCells];
for (CustomUITableViewCell * cell in visibleCell) {
if ([cell isKindOfClass:[CustomUITableViewCell class]]) {
[cell.wkWebView setNeedsLayout];
}
}
}
Ese código recopilará todas las celdas visibles y realizará el setNeedsLayout
en una enumeración rápida durante el desplazamiento del usuario.
Tengo WKWebView dentro de la UITableViewCell. La solicitud de carga de la vista web y luego, una vez que finalice la carga, cambiaré el tamaño de la altura de la vista web para que sea igual a la altura del contenido, luego ajustaré la altura de la celda de la vista de tabla para que se ajuste en consecuencia.
Lo que sucedió fue que la vista web solo muestra el área que se ajusta al tamaño de la pantalla. Cuando me desplazo, todo es blanco. Pero veo que la vista web renderizada con la altura correcta, toque y mantenga presionada en el área blanca de la vista web todavía vea la selección. Al hacer zoom con pellizco, el área de visualización web que se muestra en la pantalla es visible, pero otras áreas a veces se vuelven blancas.
Funciona bien en iOS 8 y 9. He creado un proyecto de ejemplo para demostrar este comportamiento aquí: https://github.com/pawin/strange-wkwebview
Abrir el radar: https://openradar.appspot.com/radar?id=4944718286815232
Actualización: Este problema se resuelve en iOS11
También tengo uitableview con celular con wkWebView. Y apilo con el mismo problema. Pero oportuna puedes arreglar esto con este código. Por rendimiento no te preocupes. Probé esta solución en el iPhone 5s y tomé un 10-15% de CPU solo cuando se desplaza por uitableView con una celda 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)
}
}
Tengo el mismo problema: agregue un WKWebView a un UITableViewCell y resolví este problema siguiendo estos pasos:
1.Cree una instancia de UITextView y agréguela a la vista de supervisión de UITableView (UIViewControllew.view) 2. implemente códigos en scrollViewDidScroll como este:- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
[self.xxtextView becomeFirstResponder];
[self.xxtextView resignFirstResponder];
}
Estos códigos pueden causar una mayor sobrecarga de rendimiento de la CPU, puede solucionarlo de alguna manera, como si usáramos una variable temporal como valor de umbral.
No creo que este sea un método de resolución perfecta, pero funciona para mí.
Finalmente, me di cuenta de que textview BecomeFirstResponder simplemente dirigió el diseño de la vista web de nuevo, por lo que puedes corregirlo así:
CGFloat tempOffset = 0;
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
if (!tempOffset || ABS(scrollView.contentOffset.y - tempOffset) > ScreenHeight/2)
{
[self.wkWebView setNeedsLayout];
tempOffset = scrollView.contentOffset.y;
}
}
WKWebView
forzar el WKWebView
de WKWebView
mientras su UITableView
desplaza.
// 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()
}
Sin embargo, no es la mejor solución, pero al menos el usuario puede ver el resto del contenido