Es posible conseguir un UIImage de una UIView creado con snapshotViewAfterScreenUpdates?

Una UIView regresó de snapshotViewAfterScreenUpdates se ve bien cuando se añade como una subvista, pero la siguiente se produce un negro de la imagen:

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;
}

Por supuesto que es posible obtener la imagen sin tener que depender de snapshotViewAfterScreenUpdates:

UIImage *snapshotImage = [self imageFromView:someView];

Por desgracia, cuando se captura una vista compleja, drawViewHierarchyInRect no puede igualar la velocidad de snapshotViewAfterScreenUpdates. Tenía la esperanza de que sería más rápido para conseguir UIImage de una vista creada por snapshotViewAfterScreenUpdates, es esto posible?

InformationsquelleAutor carton | 2013-11-25

1 Comentario

  1. 20

    La respuesta parece ser NO y Apple documentación confirma implícitamente esta:

    Si desea aplicar un efecto gráfico, tales como el desenfoque, a una instantánea, el uso de la drawViewHierarchyInRect:afterScreenUpdates: método
    en su lugar.

    Vale la pena señalar que el la Aplicación de Atractiva interfaz de usuario en iOS sesión de WWDC13 listas snapshotViewAfterScreenUpdates como el método más rápido, pero utiliza drawViewHierarchyInRect en el código de ejemplo.

    • Creo que la razón de que esto no funciona es que la vista devuelta por la instantánea en realidad NO es de pleno derecho de la vista. Si el paso a través del depurador, verás que el tipo es ‘_UIReplicantView’. Esto me hace pensar que es sólo un optimizado copia de el otro punto de vista y no tiene el mismo «capa» características de un ‘completo’ UIView…
    • Gracias @MobileVet, es bueno saber eso. Todavía frustrante que no hay manera de obtener los píxeles de una característica que es todo acerca de la rápida captura de pantalla…
    • Apple confirma que esto no es posible. Ver: raywenderlich.com/forums/…
    • gracias por añadir ese enlace, que contiene algunas explicaciones.
    • Muy frustrante. drawViewHierarchyInRect es demasiado lento y usa demasiada CPU. Se podría pensar que habría una forma sencilla de obtener una textura de OpenGL o, al menos, un CVPixelBufferRef a partir de una vista ya que todo OpenGL debajo de todos modos…

Dejar respuesta

Please enter your comment!
Please enter your name here