2010-05-13 10 views
9

He creado un UIImagePicker/vista de cámara, con una barra de herramientas y un botón personalizado para tomar una instantánea. Realmente no puedo cambiar a usar el modo predeterminado debido al botón personalizado, y estoy dibujando en la parte superior de la vista.Obligar a un UIView a volver a dibujar inmediatamente, en lugar de durante el siguiente ciclo de ejecución

Al presionar el botón, quiero hacer una captura de pantalla con UIGetScreenImage(); Sin embargo, la barra de herramientas está apareciendo en la imagen, incluso si lo escondo en primer lugar:

//hide the toolbar 
self.toolbar.hidden = YES; 

// capture the screen pixels 
CGImageRef screenCap = UIGetScreenImage(); 

Estoy bastante seguro de que esto se debe a que a pesar de que la barra de herramientas está oculta, que se vuelve a dibujar una vez que devuelve la función y entramos el siguiente ciclo de ejecución: después de llamar a UIGetScreenImage.

He intentado hacer la siguiente adición, pero no sirvió de nada:

//hide the toolbar 
self.toolbar.hidden = YES; 
[self.toolbar drawRect:CGRectMake(0, 0, 320, 52)]; 

// capture the screen pixels 
CGImageRef screenCap = UIGetScreenImage(); 

También he intentado usar setNeedsDisplay, pero eso no funciona bien porque una vez más el sorteo pasa después de las actuales devuelve la función.

¿Alguna sugerencia? ¡Gracias!

Respuesta

3

Intente ocultar los elementos de la IU en un selector independiente y utilizando el método -performSelectorOnMainThread:withObject:waitUntilDone:, utilizando YES para el argumento waitUntilDone. Luego siga con otro selector para captura de pantalla.

+0

Esto solo no lo hizo, pero una pequeña adición lo hizo funcionar. Llamé al selector de captura de pantalla con [self performSelector: @selector (captureScreen) withObject: nil afterDelay: 0]; y eso hizo el trabajo. Gracias por el liderazgo! –

+0

[self performSelector: @selector (captureScreen) withObject: nil afterDelay: 0]; en realidad hace que "captureScreen" se ejecute en el siguiente ciclo de ejecución. –

8

La actualización se realiza en el ciclo de ejecución.

Basta con añadir:

self.toolbar.hidden = SI;

[[NSRunLoop currentRunLoop] runUntilDate: [NSDate dateWithTimeIntervalSinceNow: 0,01]];

CGImageRef screenCap = UIGetScreenImage();

+0

Esto hace el trabajo y es más fácil de implementar, gracias Antoine. –

Cuestiones relacionadas