Quiero convertir un UIView en una imagen y guardarlo en mi aplicación. ¿Alguien puede decirme cómo tomar una captura de pantalla de una vista o convertirla en una imagen y cuál es la mejor manera de guardarla en una aplicación (no en el carrete de la cámara)? Aquí está el código de la vista:
var overView = UIView(frame: CGRectMake(0, 0, self.view.frame.width/1.3, self.view.frame.height/1.3))
overView.center = CGPointMake(CGRectGetMidX(self.view.bounds),
CGRectGetMidY(self.view.bounds)-self.view.frame.height/16);
overView.backgroundColor = UIColor.whiteColor()
self.view.addSubview(overView)
self.view.bringSubviewToFront(overView)
ios
swift
uiview
screenshot
Sameer Hussain
fuente
fuente
Respuestas:
Una extensión en
UIView
debería funcionar.Apple desaconseja usar
UIGraphicsBeginImageContext
iOS 10 con la introducción de la gama de colores P3.UIGraphicsBeginImageContext
es sRGB y solo de 32 bits. Presentaron la nuevaUIGraphicsImageRenderer
API que está completamente administrada por colores, basada en bloques, tiene subclases para archivos PDF e imágenes y administra automáticamente la vida útil del contexto. Consulte la sesión 205 de WWDC16 para obtener más detalles (la reproducción de la imagen comienza alrededor de las 11:50)Para asegurarse de que funcione en todos los dispositivos, utilícelo
#available
con un respaldo a versiones anteriores de iOS:fuente
let view = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100)); view.backgroundColor = .black; view.layer.cornerRadius = 9; view.asImage();
puedes usar la extensión
Aquí la rápida versión 3/4:
fuente
let image = UIImage(view: myView)
UIGraphicsBeginImageContextWithOptions(view.frame.size, false, UIScreen.main.scale)
Convierta su UIView a una imagen con drawViewHierarchyInRect: afterScreenUpdates: que es muchas veces más rápido que renderInContext
Nota importante: no llame a esta función desde viewDidLoad o viewWillAppear , asegúrese de capturar una vista después de que se muestre / cargue por completo
Obj C
Guardar la imagen editada Álbum de fotos
Rápido 3/4
Generalización súper fácil con extensión, iOS11, swift3 / 4
fuente
En iOS 10:
fuente
Mejores prácticas a partir de iOS 10 y Swift 3
aunque sigue siendo compatible con iOS 9 y versiones anteriores, todavía funciona a partir de iOS 13, Xcode 11.1, Swift 5.1
No estoy seguro de qué significa la pregunta con:
fuente
fuente
Por ejemplo, si tengo una vista de tamaño: 50 50 a 100,100. Puedo usar lo siguiente para tomar una captura de pantalla:
fuente
En mi opinión, el enfoque con el inicializador no es tan bueno porque crea dos imágenes.
Prefiero esto:
fuente
Swift 4.2, iOS 10
Muestra
fuente
Esto me funciona para Xcode 9 / Swift 3.2 / Swift 4 y Xcode 8 / Swift 3
Aquí se explica cómo usarlo dentro de una función:
A continuación, se explica cómo hacer algo con la imagen devuelta por la función:
Me dieron el Xcode 9 / Swift 3.2 / 4 Swift respuesta de Paul Hudson convertido UIView a UIImage
Obtuve el Xcode 8 / Swift 3 de algún lugar en SO hace mucho tiempo y olvidé dónde :(
fuente
o en objetivo-c
fuente
Puedes usarlo fácilmente usando la extensión como esta
Si desea utilizar esos métodos / variables de extensión, implemente esto
Extensión de UIImage
Extensión UIView
Extensión de la aplicación UIApplication extension
fuente
o iOS 10+, puede usar el nuevo UIGraphicsImageRenderer + el drawHierarchy recomendado, que en algunas situaciones puede ser mucho más rápido que layer.renderInContext
fuente
¡Gracias @Bao Tuan Diep! Quiero agregar un suplemento.
Cuando usas el código:
Debes notar que:
Entonces, debes usar :
actualizar
yourView
antesyourView.layer.render(in:UIGraphicsGetCurrentContext()!)
.De lo contrario, puede obtener un objeto de imagen que no contiene elementos.
fuente
Rápido 4.2
fuente
Implementación en Swift 3 :
Agregue el código a continuación, fuera del alcance de la clase.
Uso:
fuente
Implementé @Naveed J. así, y funcionó como un encanto.
Aquí estaba su extensión:
Así es como lo implementé.
fuente
Inicializador con el nuevo UIGraphicsImageRenderer disponible desde iOS 10:
fuente
trabaja bien conmigo!
Swift4
fuente
return snapshotImageFromMyView!
Hilo 1: Error fatal: Inesperadamente se encontró nulo al desenvolver un valor opcionalPara la vista que contiene una subvista borrosa (por ejemplo, una instancia de UIVisualEffectView ), solo funciona drawViewHierarchyInRect: afterScreenUpdates .
La respuesta de @ViJay Avhad es correcta para este caso.
fuente
El uso de UIGraphicsImageRenderer no funciona cuando la vista contiene subvistas del Kit de escena, Metal o Kit de Sprite. En estos casos, utilice
fuente
fuente