2009-04-25 13 views
22

Mam UIView, który ma obraz, a niektóre przyciski jako subviews. Chciałbym uzyskać jego "migawkowy" obraz przy użyciu renderInContext lub innej metody.Rendering UIView z dziećmi

[clefView.layer renderInContext:mainViewContentContext]; 

Gdybym przekazać go mój UIView (jak wyżej), a następnie otrzymuję pustą bitmapę. Żadne z dzieci nie jest renderowane do bitmapy.

Jeśli przekażę dziecku widok, który jest obrazem, otrzymam obraz tej mapy bitowej i, co nie powinno dziwić, żadne z jego rodzeństwa (przyciski).

Miałem nadzieję, że renderInContext zrobi zdjęcie i wszystkie widoczne dzieci i przekształci je w bitmapę. Czy ktoś ma jakieś pomysły, jak to zrobić?

Odpowiedz

35

spróbować czegoś takiego:

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

Dzięki, ale to się nie udało. Otrzymuję takie same wyniki. Problem, jak sądzę, polega na tym, że renderInContext nie przechodzi przez pod-widoki i wykonuje tylko górną warstwę, która jest do niego przekazywana (pomimo tego, co myślę, że powinna zrobić). Czy muszę wywoływać metodę renderInContext dla każdego wydziału? – mahboudz

+0

OK, grając z tym trochę więcej i to jest właściwa odpowiedź. Mój ImageContext był ustawiony na widok rodzeństwa, a nie na widok super. Dzięki! – mahboudz

+0

Działa to znacznie lepiej niż jakakolwiek inna metoda, którą spotkałem. – freespace

0

Prosta wersja 4-liniowy nie dla mnie. Mam UIView (z podwarstwami) i dziecko UITextView. Mogę renderować UIView do UIImage OK, ale UITextView podrzędnego nie zostanie wyrenderowany.

Mam proste rozwiązanie jest następujące:

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

Należy zauważyć, że proste wykorzystanie CGContextTranslateCTM przyjmuje poglądy dziecka nie mają przekształcić inne niż tłumaczenie. Ponadto zakładam, że widoki podrzędne są całkowicie zawarte w ramce widoku rodzica.