2009-09-15 4 views
6

Ich habe eine UIView, die mehrere UIImageViews als Subviews hat. Für jeden dieser Teilansichten wurde eine unterschiedliche affine Transformation angewendet. Ich würde gerne eine Bildschirmaufnahme von meinem UIView machen, die es als UIImage oder eine andere Bilddarstellung aufnimmt.Flatten UIViews Subviews zu UIImage iPhone 3.0

Die Methode, die ich bereits versucht haben, mit den Schichten zu einem CGContext Rendering:

[view.layer renderInContext:UIGraphicsGetCurrentContext()]; 

die Positionierung oder andere Affintransformationen meiner Subviews nicht erhalten hat.

Ich würde einen Kick in die richtige Richtung wirklich schätzen.

Antwort

11

Try this:

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

Sie es gehen. Ich musste nur self.view.size in self.view.frame.size ändern und renderInContext verwenden. Ich bin mir nicht sicher, wie ich das vermisst habe, ich denke, der Schlüsselsatz aus Apples Dokumenten ist "Renders im Koordinatenraum der Ebene." Danke! – SooDesuNe

+4

Ab iOS4 sollten Sie UIGraphicsBeginImageContextWithOptions (size, NO, 0.0) verwenden – steipete

+0

Verwenden Sie stattdessen 'YES', wenn Sie möchten, dass es undurchsichtig ist. Hilft Leistung, wenn Sie kein Alpha benötigen. –

0

Hier ist ein Swift 2.x Version:

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