2009-04-25 16 views
22

Tengo un UIView que tiene una imagen y algunos botones como sus subvistas. Me gustaría obtener una imagen de "instantánea" usando renderInContext u otro método.Rendering UIView con sus hijos

[clefView.layer renderInContext:mainViewContentContext]; 

Si lo paso a mi UIView (como antes) cuando me siento un mapa de bits en blanco. Ninguno de los niños se representa en el mapa de bits.

Si paso la vista secundaria que es la imagen, entonces obtengo una imagen de ese mapa de bits y, como era de esperar, ninguno de sus hermanos (botones).

Esperaba que renderInContext tomara la imagen y todos sus elementos secundarios visibles y la convirtiera en un mapa de bits. ¿Alguien tiene alguna idea de cómo hacer esto?

Respuesta

35

intentar algo como esto:

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

Gracias, pero eso no lo hizo. Obtuve los mismos resultados. El problema, creo, es que renderInContext no está atravesando las subvistas y solo está haciendo la capa superior que se le pasa (a pesar de lo que creo que se supone que debe hacer). ¿Debo llamar a renderInContext para cada subvista? – mahboudz

+0

Ok, jugando un poco más y esta es la respuesta correcta. My ImageContext se estaba configurando a una vista de hermanos, no a una supervista. Gracias! – mahboudz

+0

Esto funciona mucho mejor que cualquier otro método que he encontrado. – freespace

0

La versión simple de 4 líneas no funcionó para mí. Tengo un UIView (con subcapas) y un niño UITextView. Puedo renderizar UIView en UIImage OK, pero el niño UITextView no se procesa.

Mi solución sencilla es la siguiente:

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(); 

Tenga en cuenta que el simple uso de CGContextTranslateCTM asume el punto de vista del niño no han transformar distinta de la traducción. También asumo que las vistas secundarias están completamente contenidas dentro del marco de vista principal.