Me pregunto cómo mi aplicación de iPhone puede tomar una captura de pantalla de un específico UIView
como UIImage
.
Intenté este código pero todo lo que obtengo es una imagen en blanco.
UIGraphicsBeginImageContext(CGSizeMake(320,480));
CGContextRef context = UIGraphicsGetCurrentContext();
[myUIView.layer drawInContext:context];
UIImage *screenShot = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
myUIView
tiene dimensiones 320x480 y tiene algunas sub-vistas. ¿Cuál es la forma correcta de hacer esto?
ios
objective-c
uiview
screenshot
cduck
fuente
fuente
Respuestas:
Creo que puede querer
renderInContext
, nodrawInContext
. drawInContext es más un método que anularía ...Tenga en cuenta que es posible que no funcione en todas las vistas, específicamente hace aproximadamente un año, cuando traté de usar esto con la vista de cámara en vivo, no funcionó.
fuente
iOS 7 tiene un nuevo método que le permite dibujar una jerarquía de vistas en el contexto gráfico actual. Esto se puede usar para obtener un UIImage muy rápido.
Implementé un método de categoría
UIView
para obtener la vista comoUIImage
:Es considerablemente más rápido que el
renderInContext:
método existente .Referencia: https://developer.apple.com/library/content/qa/qa1817/_index.html
ACTUALIZACIÓN PARA SWIFT : una extensión que hace lo mismo:
ACTUALIZACIÓN PARA SWIFT 3
fuente
Debe capturar la ventana clave para una captura de pantalla o una vista UIView. Puedes hacerlo en Retina Resolution utilizando UIGraphicsBeginImageContextWithOptions y establecer su parámetro de escala 0.0f. Siempre captura en resolución nativa (retina para iPhone 4 y posterior).
Este hace una captura de pantalla completa (ventana clave)
Este código captura una vista UIView en resolución nativa
Esto guarda el UIImage en formato jpg con un 95% de calidad en la carpeta de documentos de la aplicación si necesita hacerlo.
fuente
iOS7 en adelante, tenemos los siguientes métodos predeterminados:
Llamar al método anterior es más rápido que intentar representar el contenido de la vista actual en una imagen de mapa de bits usted mismo.
Si desea aplicar un efecto gráfico, como desenfoque, a una instantánea, utilice el
drawViewHierarchyInRect:afterScreenUpdates:
método en su lugar.https://developer.apple.com/library/ios/documentation/uikit/reference/uiview_class/uiview/uiview.html
fuente
Hay una nueva API de iOS 10
fuente
He creado una extensión utilizable para que UIView tome una captura de pantalla en Swift:
Para usarlo simplemente escriba:
fuente
UIGraphicsBeginImageContextWithOptions(self.bounds.size, false, 0);
lugar deUIGraphicsBeginImageContext(self.bounds.size);
usar el factor de escala correcto del dispositivo.drawViewHierarchyInRect
lugar derenderInContext
no.Este método puede poner en su clase de controlador.
fuente
drawRect
es no parte de la UIViewController (IIRC). Es parte de una UIView. No creo que se llame si está en el controlador.Apple ahora nos permite usarlo en una aplicación pública, aunque sea una API privada
fuente
Detalles
Solución
Uso
Muestra completa
Resultado
fuente
Apple no permite:
Las aplicaciones deben tomar una captura de pantalla utilizando el
drawRect
método especificado en: http://developer.apple.com/library/ios/#qa/qa2010/qa1703.htmlfuente
Creé esta extensión para guardar una captura de pantalla de UIView
llamada :
Si quieres crear un png debes cambiar:
por
fuente
Swift 4 actualizado:
fuente
El siguiente fragmento se utiliza para tomar capturas de pantalla:
Use el
renderInContext:
método en lugar deldrawInContext:
métodorenderInContext:
El método representa el receptor y sus subcapas en el contexto actual. Este método se procesa directamente desde el árbol de capas.fuente
fuente
puede usar la siguiente categoría de UIView:
fuente