2010-05-10 20 views
6

En mi código intento mostrar un UIWebView mientras se carga una página, y luego, cuando termina, capturar una imagen de la vista web para almacenarla en caché y mostrarla más tarde (para no tener que volver a cargarla ni procesarla) página web).¿Cómo puedo saber cuándo un UIWebView ha terminado de dibujar en un contexto?

tengo algo en la línea de:

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

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

El problema que estoy corriendo en es que, debido a la UIWebView 's alicatado, a veces sólo la mitad de la página se representa con el contexto en el momento Capturo la imagen.

¿Hay alguna forma de detectar o bloquear el hilo de representación de fondo de UIWebView para que solo pueda obtener la imagen una vez que haya finalizado todo el renderizado?


ACTUALIZACIÓN: Puede ser que las condiciones de carrera hilo eran una cortina de humo (no está claro a partir de la documentación, en todo caso, si la capa personalizada UIWebView 's o una CATiledLayer en bloques general sobre sus subprocesos en segundo plano) .

Esto en su lugar puede haber sido un problema de invalidación (a pesar de varias clases de llamadas a setNeedsDisplay tanto en el UIWebView y su capa). Cambiar los límites del UIWebView antes de representarlo parece haber eliminado el problema de "no dibujar todo".

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

Respuesta

0

UIWebView probablemente esté utilizando 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 la sustitución de 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 realmente se 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. */ 

Así que usted puede ser capaz de establecer los contenidos a cero antes de llamar renderInContext:

Cuestiones relacionadas