2010-06-27 5 views
14

Potrzebuję przechwycić UIView i wszystkie jego subviews do UIImage. Problem polega na tym, że część widoku jest poza ekranem, więc nie mogę korzystać z funkcji przechwytywania ekranu, a kiedy próbuję użyć funkcji UIGraphicsGetImageFromCurrentImageContext(), nie wydaje się ona również przechwytywać podrzędnych. Czy powinien on przechwytywać subviews i robię coś złego? Jeśli nie, czy istnieje inny sposób osiągnięcia tego?Potrzebujesz przechwycić UIView do UIImage, włączając wszystkie subviews

+0

myślę, że skoro każdy 'UIView' dzwoni warstwa opartej' - [CALayer drawInContext: viewContext] 'może pomóc. –

Odpowiedz

2

Czy oznacza

UIGraphicsBeginImageContext(view.bounds.size); 
[view.layer drawInContext:UIGraphicsGetCurrentContext()]; 
UIImage * img = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

nie działa? Jestem pewien, że powinniśmy ...

27

że to właściwa droga:

+ (UIImage *) imageWithView:(UIView *)view 
{ 
    UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, [[UIScreen mainScreen] scale]); 
    [view.layer renderInContext:UIGraphicsGetCurrentContext()]; 
    UIImage * img = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return img; 
} 

Ta metoda to metoda rozszerzenie dla klasy UIImage, a także dbać o dokonaniu wygląd obrazu dobre na przyszłe urządzenia o wysokiej rozdzielczości.

+2

Naprawdę działa !!! – AlexeyVMP

+0

Zaoszczędziłem mój czas :) Dzięki –

0

Oto Swift w wersji 2.x, który powinien działać, jeśli najpierw utworzyć tablicę UIViews aby spłaszczona:

// Flattens <allViews> into single UIImage 
func flattenViews(allViews: [UIView]) -> UIImage? { 
    // Return nil if <allViews> empty 
    if (allViews.isEmpty) { 
     return nil 
    } 

    // If here, compose image out of views in <allViews> 
    // Create graphics context 
    UIGraphicsBeginImageContextWithOptions(UIScreen.mainScreen().bounds.size, false, UIScreen.mainScreen().scale) 
    let context = UIGraphicsGetCurrentContext() 
    CGContextSetInterpolationQuality(context, CGInterpolationQuality.High) 

    // Draw each view into context 
    for curView in allViews { 
     curView.drawViewHierarchyInRect(curView.frame, afterScreenUpdates: false) 
    } 

    // Extract image & end context 
    let image = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 

    // Return image 
    return image 
}