2013-11-25 22 views
24

È possibile ottenere un UIImage da un UIView creato con snapshotViewAfterScreenUpdates?UIImmagine da un UIView creato con snapshotViewAfterScreenAggiorna:

A UIView tornato da snapshotViewAfterScreenUpdates osserva benissimo quando aggiunto come una visualizzazione secondaria, ma il seguente produce un'immagine in bianco:

UIView *snapshotView = [someView snapshotViewAfterScreenUpdates:YES]; 
UIImage *snapshotImage = [self imageFromView:snapshotView]; 

- (UIImage *)imageFromView:(UIView *)view 
{ 
    UIGraphicsBeginImageContextWithOptions(view.bounds.size, YES, 0.0); 
    // [view.layer renderInContext:UIGraphicsGetCurrentContext()]; // <- same result... 
    [view drawViewHierarchyInRect:view.bounds afterScreenUpdates:NO]; 
    UIImage * img = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return img; 
} 

Naturalmente è possibile ottenere l'immagine senza fare affidamento su snapshotViewAfterScreenUpdates:

UIImage *snapshotImage = [self imageFromView:someView]; 

Sfortunatamente, quando si acquisisce una vista complessa, drawViewHierarchyInRect non può corrispondere alla velocità di snapshotViewAfterScreenUpdates. Speravo che sarebbe stato più veloce ottenere il UIImage da una vista creata da snapshotViewAfterScreenUpdates, è possibile?

risposta

20

La risposta sembra essere NO e Apple documentation conferma implicitamente questo:

Se si desidera applicare un effetto grafico, come sfocatura, ad una fotografia, utilizzare il metodo invece drawViewHierarchyInRect:afterScreenUpdates:.

Vale la pena notare che il Implementazione Engaging interfaccia utente su iOS sessione dal WWDC13 elenca snapshotViewAfterScreenUpdates come il metodo più veloce, ma utilizza drawViewHierarchyInRect nel codice di esempio.

+2

Penso che la ragione per cui questo non funzioni è che la vista restituita dallo snapshot NON è in realtà una vista completa. Se passi attraverso il debugger, vedrai che il suo tipo è '_UIReplicantView'. Questo mi fa pensare che sia solo una copia ottimizzata dell'altra vista e che non abbia le stesse caratteristiche 'di livello' di un UIView 'completo' ... – MobileVet

+1

Grazie a @MobileVet, è bello sapere. Ancora frustrante che non ci sia modo di ottenere i pixel da una funzionalità che riguarda l'acquisizione rapida dello schermo ... – carton

+1

Apple conferma che ciò non è possibile. Vedi: http://www.raywenderlich.com/forums/viewtopic.php?f=37&t=8993&start=10 –

Problemi correlati