2012-01-22 11 views
8

Ho trovato questo codice che è piuttosto bella:Cattura UIImage di UIView tra cui UINavigationBar

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

ma ho bisogno di catturare UINavigationBar così perché voglio utilizzare l'immagine come strato di transizione nel mio UIStoryboardSegue. Qualche idea?

risposta

7

Utilizza la finestra della tua vista come vista per includere anche la barra di navigazione e la barra di stato. Se è necessario rimuovere la barra di stato, sarà necessario ritagliare l'immagine.

+0

Come posso scattare un viewcontroller inclusa la barra di navigazione PRIMA di spingerlo? Devo fare uno screenshot del controller della vista di destinazione a schermo intero. – cschuff

+0

Se si dispone di un puntatore al controller della vista, è possibile accedere facilmente alla vista del controller della vista anche se non è stata ancora inserita. –

+0

Sì, ma 1. la barra di navigazione non appartiene alla vista e 2. non posso accedere alla sua barra di navigazione prima che venga spinta. L'aspetto delle barre di navigazione in VC2 è diverso da VC1. – cschuff

2

invece di view.layer fornisce riferimento a appdelegate.window.layer che funzionerà.

+0

Questo ha funzionato per me su iOS 8+ – superpuccio

3

Si dovrebbe fare uno screenshot di self.navigationController? .view. In questo modo si ottiene l'intera vista con navigationBar ma senza barra di stato.

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

Ha funzionato per me su iOS 8 o versioni successive – superpuccio

0

Wow, davvero nessuna di queste risposte funziona. Ecco come lo fai per ottenere screenshot di tutto compreso il controller di navigazione

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

} 
Problemi correlati