2009-04-25 16 views
22

Ich habe eine UIView, die ein Bild und einige Schaltflächen als Unteransichten hat. Ich würde gerne ein "Schnappschuss" Bild davon mit renderInContext oder einer anderen Methode bekommen.Rendering UIView mit seinen Kindern

[clefView.layer renderInContext:mainViewContentContext]; 

Wenn ich es passieren mein UIView (wie oben), dann bekomme ich eine leere Bitmap. Keines der Kinder wird in die Bitmap gerendert.

Wenn ich es übergeben die untergeordnete Ansicht, die das Bild ist, dann bekomme ich ein Bild von dieser Bitmap und, nicht überraschend, keine ihrer Geschwister (Schaltflächen).

Ich hoffte, dass renderInContext würde das Bild und alle sichtbaren Kinder und rendern es in eine Bitmap. Hat jemand Ideen, wie man das macht?

Antwort

35

versuchen, etwas wie folgt aus:

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

Danke, aber das hat es nicht getan. Ich bekomme die gleichen Ergebnisse. Das Problem, denke ich, ist, dass renderInContext die Subviews nicht durchläuft und nur die oberste Ebene tut, die an sie übergeben wird (trotz allem, was ich denke, dass es das tut). Muss ich renderInContext für jede Unteransicht aufrufen? – mahboudz

+0

Ok, spiele ein bisschen mehr damit und das ist die richtige Antwort. Mein ImageContext wurde auf eine Geschwisteransicht und nicht auf eine Superview festgelegt. Danke! – mahboudz

+0

Dies funktioniert viel besser als jede andere Methode, auf die ich gestoßen bin. – freespace

0

Die einfache 4-line-Version nicht für mich arbeiten. Ich habe eine UIView (mit Sublayern) und ein Kind UITextView. Ich kann die UIView in die UIImage OK, aber die untergeordnete UITextView wird nicht gerendert.

Meine einfache Lösung ist wie folgt:

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

Beachten Sie, dass die einfache Verwendung von CGContextTranslateCTM die Kindern Ansichten übernimmt keine andere Transformation als Übersetzung. Ich gehe auch davon aus, dass die Kindansichten vollständig im übergeordneten Ansichtsrahmen enthalten sind.

Verwandte Themen