2009-09-15 8 views
6

J'ai un UIView qui a plusieurs UIImageViews sous-vues. Chacune de ces sous-vues a eu une transformation affine différente appliquée. Je voudrais prendre ce qui équivaut à une capture d'écran de mon UIView, en le capturant comme un UIImage, ou une autre représentation d'image.Aplatir les sous-vues UIViews vers UIImage iPhone 3.0

La méthode que je l'ai déjà essayé, ce qui rend les couches à un CGContext avec:

[view.layer renderInContext:UIGraphicsGetCurrentContext()]; 

ne conserve pas le positionnement ou d'autres transformations affines de mes sous-vues.

J'apprécierais vraiment un coup de pied dans la bonne direction.

Répondre

11

Essayez ceci:

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

Vous allez lui. Je devais juste changer self.view.size en self.view.frame.size et utiliser renderInContext. Je ne sais pas comment j'ai manqué cela, je suppose que la phrase clé des docs d'Apple est "rend dans l'espace de coordonnées de la couche." Merci! – SooDesuNe

+4

En commençant par iOS4, vous devez utiliser UIGraphicsBeginImageContextWithOptions (size, NO, 0.0) – steipete

+0

Utilisez plutôt 'YES' si vous voulez qu'il soit opaque. Aide la performance si vous n'avez pas besoin d'alpha. –

0

est ici une version 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 
}