2012-01-22 9 views
8

Znalazłem ten kod, który jest całkiem ładny:Przechwytywanie UIImage z UIView tym UINavigationBar

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

Ale muszę uchwycić UINavigationBar jak również dlatego chcę użyć obrazu jako warstwy przejściowej w moim UIStoryboardSegue. Jakieś pomysły?

Odpowiedz

7

Użyj okna widoku jako widoku, aby pasek nawigacyjny i pasek stanu również zostały uwzględnione. Jeśli chcesz usunąć pasek stanu, musisz przyciąć obraz.

+0

Jak mogę zrzutu ekranu kontroler widoku, w tym pasek nawigacyjny PRZED jego naciśnięciu? Muszę zrzutu ekranu docelowego kontrolera widoku w trybie pełnoekranowym. – cschuff

+0

Jeśli masz wskaźnik do kontrolera widoku, możesz łatwo uzyskać dostęp do widoku kontrolera widoku, nawet jeśli jeszcze go nie pchnął. –

+0

Tak, ale 1. czy pasek nawigacyjny nie należy do widoku i 2. nie mogę uzyskać dostępu do jego paska nawigacyjnego przed jego pchnięciem. Wygląd pasków nawigacyjnych w VC2 różni się od VC1. – cschuff

2

zamiast view.layer podaj odniesienie do appdelegate.window.layer to zadziała.

+0

To działało dla mnie na iOS 8+ – superpuccio

3

Powinieneś zrobić zrzut ekranu z self.navigationController? .view. W ten sposób otrzymasz cały widok za pomocą paska nawigacji, ale bez paska stanu.

if let view = self.navigationController?.view { 
    let snapshot = view.snapshotViewAfterScreenUpdates(false) 
} 
+0

To działało dla mnie na iOS 8+ – superpuccio

0

Wow, naprawdę żadna z tych odpowiedzi nie działa. Oto, jak to zrobić, aby uzyskać zrzut ekranu ze wszystkim, łącznie z kontrolerem nawigacyjnym,

-(void) takeScreenshot 
{ 

    CGRect screenRect = [[UIScreen mainScreen] bounds]; 
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) 
    { 
     //its iphone 


     CGSize result = [[UIScreen mainScreen] bounds].size; 
     if(result.height == 480 || result.width == 480) 
     { 
      // iPhone Classic 
      screenRect = CGRectMake(0, 0, 320, 480); 
     } 
     if(result.height == 568 || result.width == 568) 
     { 
      // iPhone 5 
      screenRect = CGRectMake(0, 0, 320, 568); 
     } 
    } 
    else 
    { 
     //its pad 
     screenRect = CGRectMake(0, 0, 768, 1024); 
    } 

    NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString* documentsDirectory = [paths objectAtIndex:0]; 

    // This code is for high resolution screenshot 
    UIGraphicsBeginImageContextWithOptions(screenRect.size, NO, 0.0); 

    //this was pre iOS 7.0 
    //[self.view.layer renderInContext:UIGraphicsGetCurrentContext()]; 

    // iOS 7.x --> 
    [[[[UIApplication sharedApplication] windows] objectAtIndex:0] drawViewHierarchyInRect:self.view.bounds afterScreenUpdates:YES]; // Set To YES 

    UIImage *viewImage2 = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 


    NSData* imageData2 = UIImageJPEGRepresentation(viewImage2, 1.0); 
    NSString* incrementedImgStr2 = [NSString stringWithFormat: @"UserScreenShotPic.jpg"]; 


    // Now we get the full path to the file 
    NSString* fullPathToFile3 = [documentsDirectory stringByAppendingPathComponent:incrementedImgStr2]; 
    [imageData2 writeToFile:fullPathToFile3 atomically:NO]; 

} 
Powiązane problemy