Solución:
Para dibujar una vista, simplemente use esto:
// Begin context
UIGraphicsBeginImageContextWithOptions(view.bounds.size, false, UIScreen.mainScreen().scale)
// Draw view in that context
drawViewHierarchyInRect(view.bounds, afterScreenUpdates: true)
// And finally, get image
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
Si desea usarlo varias veces, probablemente la extensión haría el trabajo:
// Swift4
extension UIView {
func takeScreenshot() -> UIImage {
// Begin context
UIGraphicsBeginImageContextWithOptions(self.bounds.size, false, UIScreen.main.scale)
// Draw view in that context
drawHierarchy(in: self.bounds, afterScreenUpdates: true)
// And finally, get image
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
if (image != nil)
{
return image!
}
return UIImage()
}
}
// Viejo vencejo
extension UIView {
func takeScreenshot() -> UIImage {
// Begin context
UIGraphicsBeginImageContextWithOptions(self.bounds.size, false, UIScreen.mainScreen().scale)
// Draw view in that context
drawViewHierarchyInRect(self.bounds, afterScreenUpdates: true)
// And finally, get image
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
}
}
Para explicar qué hacen esos parámetros:
UIGraphicsBeginImageContextWithOptions () crea un contexto de representación temporal en el que se dibuja el original. El primer argumento, tamaño, es el tamaño de destino de la imagen escalada. El segundo argumento, isOpaque, se usa para determinar si se representa un canal alfa. Establecer esto en falso para imágenes sin transparencia (es decir, un canal alfa) puede resultar en una imagen con un tono rosado. La escala del tercer argumento es el factor de escala de visualización. Cuando se establece en 0.0, se usa el factor de escala de la pantalla principal, que para las pantallas Retina es 2.0 o superior (3.0 en el iPhone 6 Plus).
Más sobre esto aquí http://nshipster.com/image-resizing/
En cuanto a la llamada de sorteo, Apple Docs lo explica con detalle aquí y aquí.
swift 4 y iOS 10+
extension UIView {
func screenshot() -> UIImage {
return UIGraphicsImageRenderer(size: bounds.size).image { _ in
drawHierarchy(in: CGRect(origin: .zero, size: bounds.size), afterScreenUpdates: true)
}
}
}
Una alternativa a la respuesta de Alessandro, un poco más breve y con estilo Swift:
extension UIView {
var snapshot: UIImage {
return UIGraphicsImageRenderer(size: bounds.size).image { _ in
drawHierarchy(in: bounds, afterScreenUpdates: true)
}
}
}