2009-09-15 17 views
6

Tengo una UIView que tiene varios UIImageView como subvistas. Cada una de estas subvistas ha tenido una transformación afín diferente aplicada. Me gustaría tomar lo que equivale a una captura de pantalla de mi UIView, capturarlo como un UIImage, o alguna otra representación de imagen.Aplanar las subvistas de UIViews a UIImage iPhone 3.0

El método He intentado ya, haciendo que las capas a un CGContext con:

[view.layer renderInContext:UIGraphicsGetCurrentContext()]; 

no conserva el posicionamiento o otras transformaciones afines de mis subvistas.

Realmente agradecería una patada en la dirección correcta.

Respuesta

11

Prueba esto:

UIGraphicsBeginImageContext(self.view.frame.size); 
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
+1

Vas ella. Solo tuve que cambiar self.view.size a self.view.frame.size y usar renderInContext. No estoy seguro de cómo me perdí esto, creo que la frase clave de los documentos de Apple es "Renders en el espacio de coordenadas de la capa". Gracias! – SooDesuNe

+4

A partir de iOS4, debe usar UIGraphicsBeginImageContextWithOptions (size, NO, 0.0) – steipete

+0

Use 'YES' en su lugar si desea que sea opaca. Ayuda al rendimiento si no necesitas alfa. –

0

Aquí hay una versión 2.x Swift:

// This flattens <allViews> into single UIImage 
func flattenViews(allViews: [UIView]) -> UIImage? { 
    // Return nil if <allViews> empty 
    if (allViews.isEmpty) { 
     return nil 
    } 

    // If here, compose image out of views in <allViews> 
    // Create graphics context 
    UIGraphicsBeginImageContextWithOptions(UIScreen.mainScreen().bounds.size, false, UIScreen.mainScreen().scale) 
    let context = UIGraphicsGetCurrentContext() 
    CGContextSetInterpolationQuality(context, CGInterpolationQuality.High) 

    // Draw each view into context 
    for curView in allViews { 
     curView.drawViewHierarchyInRect(curView.frame, afterScreenUpdates: false) 
    } 

    // Extract image & end context 
    let image = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 

    // Return image 
    return image 
} 
Cuestiones relacionadas