2009-09-15 11 views
6

Ho un UIView che ha diverse UIImageViews come subviews. A ciascuna di queste sottoview è stata applicata una trasformazione affine diversa. Vorrei prendere ciò che equivale a una cattura dello schermo del mio UIView, catturandolo come un UIImage o qualche altra immagine.Flatten Uiviews Subviews a UIImage iPhone 3.0

Procedimento Ho provato già, rendendo gli strati di un CGContext con:

[view.layer renderInContext:UIGraphicsGetCurrentContext()]; 

non conserva il posizionamento o altre trasformazioni affini dei miei subviews.

Gradirei davvero un calcio nella giusta direzione.

risposta

11

Prova questo:

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

Tu vai esso. Ho solo dovuto cambiare self.view.size a self.view.frame.size e usare renderInContext. Non sono sicuro di quanto mi sia mancato, suppongo che la frase chiave dei documenti di Apple sia "Rende nello spazio delle coordinate del livello". Grazie! – SooDesuNe

+4

A partire da iOS4, è necessario utilizzare UIGraphicsBeginImageContextWithOptions (size, NO, 0.0) – steipete

+0

Utilizzare invece 'YES' se si desidera che sia opaco. Aiuta le prestazioni se non hai bisogno di alpha. –

0

Ecco una versione 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 
}