2009-04-25 13 views
22

Ho un UIView che ha un'immagine e alcuni pulsanti come sue sottoview. Mi piacerebbe avere un'immagine "istantanea" usando renderInContext o un altro metodo.Rendering UIView con i relativi figli

[clefView.layer renderInContext:mainViewContentContext]; 

Se mi passa il mio UIView (come sopra) tanto sono un bitmap vuota. Nessuno dei bambini viene visualizzato nella bitmap.

Se si passa la vista figlio che è l'immagine, quindi ottengo un'immagine di tale bitmap e, non sorprendentemente, nessuno dei suoi fratelli (pulsanti).

Speravo che lo renderInContext prendesse l'immagine e tutti i bambini visibili e la rendesse in una bitmap. Qualcuno ha qualche idea su come fare questo?

risposta

35

provare qualcosa di simile:

UIGraphicsBeginImageContext(clefView.bounds.size); 
[clefView.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage *resultingImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
+0

Grazie, ma non l'ha fatto. Ottengo gli stessi risultati. Il problema, penso, è che renderInContext non stia attraversando le subviews e faccia solo il livello superiore che gli viene passato (nonostante quello che penso dovrebbe fare). Devo chiamare renderInContext per ogni sottoview? – mahboudz

+0

Ok, giocaci un po 'di più e questa è la risposta giusta. Il mio ImageContext era impostato su una vista fratello e non su una superview. Grazie! – mahboudz

+0

Funziona molto meglio di qualsiasi altro metodo che ho incontrato. – freespace

0

La semplice versione 4-line non ha funzionato per me. Ho un UIView (con sottolivelli) e un bambino UITextView. Posso rendere UIView in UIImage OK, ma il figlio UITextView non viene visualizzato.

La mia soluzione semplice è la seguente:

CGRect rect = [view bounds]; 
UIGraphicsBeginImageContextWithOptions(rect.size, YES, 0.0f); 
CGContextRef context = UIGraphicsGetCurrentContext(); 

[view.layer renderInContext:context]; 
for (UIView *sv in view.subviews) 
{ 
    CGContextTranslateCTM(context, sv.frame.origin.x, sv.frame.origin.y); 
    [sv.layer renderInContext:context]; 
    CGContextTranslateCTM(context, -sv.frame.origin.x, -sv.frame.origin.y); 
} 

UIImage *capturedImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

Nota che il semplice utilizzo di CGContextTranslateCTM assume il punto di vista del bambino non sono altro che trasformare la traduzione. Suppongo anche che le viste secondarie siano interamente contenute nel frame della vista genitore.

Problemi correlati