iphone - problemas - ¿Cómo puedo saber cuándo UIWebView ha terminado de dibujar en un contexto?



webview swift 4 (1)

En mi código intento mostrar UIWebView mientras se carga una página, y luego, cuando UIWebView , capturar una imagen de la vista web para almacenarla en caché y mostrarla más tarde (para no tener que volver a cargar ni presentar la página web) )

Tengo algo parecido a:

CGContextRef context = CGBitmapContextCreate(…);
[[webView layer] renderInContext:context];

CGImageRef imageRef = CGBitmapContextCreateImage(context);
UIImage *image = [UIImage imageWithCGImage:imageRef];

El problema al que me estoy UIWebView es que, debido al UIWebView de UIWebView , a veces solo la mitad de la página se procesa en el contexto cuando capturo la imagen.

¿Hay alguna manera de detectar o bloquear el hilo de renderizado en segundo plano de UIWebView para que yo pueda obtener la imagen solo después de que haya finalizado todo el renderizado?

ACTUALIZACIÓN: Puede ser que las condiciones de la carrera de subprocesos fueron una pista falsa (no está claro en la documentación, en cualquier caso, si la capa personalizada de CATiledLayer o un CATiledLayer en general bloquea sus hilos de fondo).

En su lugar, esto podría haber sido un problema de invalidación (a pesar de varios tipos de llamadas a setNeedsDisplay tanto en UIWebView como en su capa). Cambiar los límites de UIWebView antes de su representación parece haber eliminado el problema de "no dibujar todo".

Todavía me encontré con un problema en el que se dibujaban algunos mosaicos en la escala anterior, pero llamar a renderInContext: dos veces parece haber mitigado lo suficiente.


UIWebView probablemente esté usando un CATiledLayer o una derivada personalizada. Es posible que pueda reemplazar la capa con algo de su elección, como un CALayer simple que no dibuja con hilos. Reemplace la capa antes de comenzar a cargar contenido.

Si reemplazar la capa con un CALayer estándar no funciona, puede que tenga que crear su propia subclase que emule el comportamiento de un CATiledLayer sin que se lo enhebre.

Editar:

De CATiledLayer.h

/* Note: do not attempt to directly modify the `contents' property of
 * an CATiledLayer object - doing so will effectively turn it into a
 * regular CALayer. */

Por lo tanto, puede establecer los contenidos en cero antes de llamar a renderInContext:





core-graphics