2015-02-13 12 views
6

Próbuję załadować widok z stalówką, skonfigurować go i zrobić zdjęcie tego, bez dodawania go do ekranu:Take migawkę widoku bez dodawania go do ekranu

+ (void)composeFromNibWithImage:(UIImage*)catImage completion:(CompletionBlock)completion { 

    NSArray *nibContents = [[NSBundle mainBundle] loadNibNamed:@"CatNib" owner:nil options:nil]; 
    CatView *catView = [nibContents firstObject]; 

    //here, catView is the correct size from the nib, but is blank if inspected with the debugger 

    catView.catImageView.image = catImage; 
    catView.furButton.selected = YES;  
    UIImage *composite = [UIImage snapshot:catView]; 
    completion(composite); 
} 

gdzie migawka jest typowa:

+ (UIImage *)snapshot:(UIView *)view 
{ 
    UIGraphicsBeginImageContextWithOptions(view.bounds.size, NO, 0.0); 
    [view drawViewHierarchyInRect:view.bounds afterScreenUpdates:YES]; 
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return image; 
} 

jednak zarówno catView i kompozytowe są prawidłowo wielkości ale puste jak i krok poprzez kod. Jak utworzyć UIImage z widoku załadowanego ze stalówki, bez dodawania widoku do ekranu?

Odpowiedz

1

To wydaje się nieco hacky, ale próbowałem i to się załatwia. Jeśli załadujesz widok ze stalówki za głównym widokiem, możesz zrobić zrzut ekranu dla tej warstwy. O ile nie jest to widok intensywnie wykorzystujący pamięć, użytkownik nigdy nie dowiedziałby się, że widok został dodany do widoku super.

UIGraphicsBeginImageContext(CGSizeMake(catView.frame.size.width, catView.frame.size.height)); 
CGContextRef context = UIGraphicsGetCurrentContext(); 
[catView.layer renderInContext:context]; 
UIImage *screenShot = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

Uruchom ten kod po załadowaniu stalówki za głównym widokiem. Po załadowaniu można go usunąć za pomocą polecenia "[catView removeFromSuperiew]"

+0

Byłem świadomy, że mogę to zrobić, dodając w jakiś sposób widok do niewidocznej części ekranu. Właściwie to nazywam ten kod z podklasy NSObject, która nie ma odniesienia do głównego widoku, więc miałem nadzieję, że istnieje sposób na załadowanie stalówki, dostosowanie jej i migawki, ale chyba nie. – soleil

3

Miałem podobny problem jakiś czas temu, i o ile mogę powiedzieć, że nie jest możliwe zrobienie migawki widoku, to w rzeczywistości na ekranie. Stworzyłem obejście i umieściłem ten widok, który chciałem zrobić migawkowo, poza bieżącymi ograniczeniami widoku ViewControllers, aby go nie było widać. W tym przypadku było możliwe utworzenie poprawnej migawki. Mam nadzieję, że to pomoże :)

0
UIGraphicsBeginImageContext(view.frame.size); 
    [self.view.layer renderInContext:UIGraphicsGetCurrentContext()]; 
    UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
+0

Myślę, że byłoby to bardziej przydatne dla OP i dalszych odwiedzających, kiedy dodacie wyjaśnienia do swoich intencji. – reporter