ios swift uiscrollview wkwebview

ios - SWIFT: eventos de desplazamiento HTML en un WKWebView que está dentro de un ScrollView



uiscrollview (2)

Tengo una página web para fines de prueba ( https://storage.googleapis.com/htmltestingbucket/nested_scroll_helper.html ) que solo imprime un contador del evento de desplazamiento que el html ha capturado en un encabezado fijo

Cuando WKWebView es el único elemento desplazable en el fragmento, todo está bien y WebView envía los eventos de desplazamiento a la página

Si quiero agregar elementos nativos arriba y debajo de WebView, las cosas se vuelven mucho más complejas.

UIScrollView UILabel WKWebView UILabel

Sé que no es bueno tener un WebView dentro de ScrollView, pero tengo que proporcionar una experiencia única de desplazamiento con contenido híbrido y eventos correctos de desplazamiento en el documento html. Encontré muchas preguntas al respecto, pero no pude crear una solución completa de extremo a extremo.


Básicamente tienes una vista de desplazamiento dentro de una vista de desplazamiento. ¿Cómo crees que eso funcionaría? Agregaría las etiquetas al HTML en WebView. No veo ninguna razón por la cual necesitan ser nativos.

Alternativamente, podría intentar agregar las etiquetas al UIScrollView de UIWebView. Esa es la primera subvista. No estoy seguro de si necesita ajustar las inserciones de la vista de desplazamiento. Inyectar html probablemente funcionaría de manera más confiable.


Actualización: Bien, me tomó un tiempo entender lo que estás tratando de hacer.

Sé que le gustaría mantener el scrollView externo, pero estoy bastante seguro de que no es posible lograr lo que quiere hacer (solo podría hacerlo si configura outerScrollView.delegate = webView , pero no funcionó para mí cuando Lo intenté)

Creo que la mejor solución sería:

  1. quitar su scrollView externo
  2. configura el contenidoInset para tu webView a la altura que necesites en la parte superior e inferior. Por ejemplo, para 100pt: webView.contentInset = UIEdgeInsetsMake(100,0,100,0);
  3. Agregue sus UIElements como subView a su UIWebView en lugar de a UIScrollView (básicamente en el espacio libre que creó con su contentInset)

Anteriormente (de otra manera):

  1. configurar una restricción de altura de su UIWebView
  2. almacene la restricción de altura como IBOutlet en su UIViewController
  3. establecer webView.scrollView.scrollEnabled = NO; en su viewDidLoad o el guión gráfico
  4. tan pronto como se cargue la vista web, extraiga su altura de contenido webView.scrollView.contentSize.height
  5. actualice la restricción de altura de UIWebView con el valor de su s content height via self.webViewContentHeightConstraint.constant = webView.scrollView.contentSize.height
  6. llame [self.scrollView layoutIfNeeded]; para asegurarse de que su vista se represente nuevamente

No te olvides de hacer los pasos 4 y 5 cuando el webView termine de cargar contenido