2010-05-13 6 views
9

Ho creato una vista UIImagePicker/fotocamera, con una barra degli strumenti e un pulsante personalizzato per scattare un'istantanea. Non posso davvero passare all'utilizzo del modo predefinito a causa del pulsante personalizzato e sto attingendo in cima alla vista.Forzare immediatamente un UIView per il ridisegno, anziché durante il ciclo di esecuzione successivo

Quando si preme il pulsante, voglio prendere uno screenshot utilizzando UIGetScreenImage(); tuttavia, la barra degli strumenti sta rivelando nell'immagine, anche se mi nascondo prima:

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

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

Sono abbastanza sicuro che questo è perché, anche se la barra degli strumenti è nascosta, esso viene ridisegnato una volta la funzione ritorna ed entriamo il ciclo di esecuzione successivo, dopo che UIGetScreenImage viene chiamato.

Ho provato a fare la seguente aggiunta, ma non ha aiutato:

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

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

Ho anche provato ad utilizzare setNeedsDisplay, ma che non funziona o perché ancora una volta il pareggio accade dopo la funzione ritorna attuali.

Qualche suggerimento? Grazie!

risposta

3

Provare a nascondere gli elementi dell'interfaccia utente in un selettore separato e utilizzare il metodo -performSelectorOnMainThread:withObject:waitUntilDone:, utilizzando YES per l'argomento waitUntilDone. Quindi seguilo con un altro selettore per l'acquisizione dello schermo.

+0

Questo da solo non lo ha fatto, ma una piccola aggiunta ha funzionato. Ho chiamato il selettore di cattura schermo con [self performSelector: @selector (captureScreen) withObject: nil afterDelay: 0]; e questo ha fatto il lavoro. Grazie per il piombo! –

+0

[self performSelector: @selector (captureScreen) withObject: nil afterDelay: 0]; effettivamente esegue "captureScreen" sul ciclo di esecuzione successivo. –

8

L'aggiornamento viene eseguito nel ciclo di esecuzione.

Basta aggiungere:

self.toolbar.hidden = YES;

[[NSRunLoop currentRunLoop] runUntilDate: [NSDate dateWithTimeIntervalSinceNow: 0.01]];

CGImageRef screenCap = UIGetScreenImage();

+0

Questo fa il lavoro ed è più semplice da implementare, grazie Antoine. –

Problemi correlati