2009-04-25 6 views
22

J'ai un UIView qui a une image et quelques boutons comme sous-vues. Je voudrais obtenir une image "instantané" de celui-ci en utilisant renderInContext, ou une autre méthode.Rendu UIView avec ses enfants

[clefView.layer renderInContext:mainViewContentContext]; 

Si je le passe mon UIView (comme ci-dessus), puis-je obtenir un bitmap vide. Aucun des enfants n'est rendu dans l'image bitmap. Si je lui passe la vue enfant qui est l'image, alors je reçois une image de ce bitmap, et, sans surprise, aucun de ses frères et sœurs (boutons).

J'espérais en quelque sorte que renderInContext prendrait l'image et tous ses enfants visibles et la rendrait dans un bitmap. Quelqu'un a-t-il des idées pour le faire?

Répondre

35

Essayez quelque chose comme ceci:

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

Merci, mais cela ne l'a pas fait. J'ai les mêmes résultats. Le problème, je pense, est que renderInContext ne traverse pas les sous-vues et ne fait que passer la couche supérieure qui lui est passée (malgré ce que je pense qu'il est censé faire). Dois-je appeler renderInContext pour chaque sous-vue? – mahboudz

+0

Ok, jouer avec un peu plus et c'est la bonne réponse. Mon ImageContext était en train d'être défini sur une vue sobling pas une vue d'ensemble. Merci! – mahboudz

+0

Cela fonctionne beaucoup mieux que toute autre méthode que j'ai rencontrée. – freespace

0

La version simple 4 en ligne ne fonctionne pas pour moi. J'ai un UIView (avec des sous-couches), et un enfant UITextView. Je peux rendre l'UIView dans l'UIImage OK, mais l'enfant UITextView n'est pas rendu.

Ma solution simple est la suivante:

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

Notez que la simple utilisation de CGContextTranslateCTM suppose que les vues de l'enfant ont pas transformer autre que la traduction. En outre, je suppose que les vues enfant sont entièrement contenues dans le cadre de vue parent.

Questions connexes