Захват UIImage UIView, включая UINavigationBar - PullRequest
8 голосов
/ 22 января 2012

Я нашел этот код, который довольно хорош:

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

Но мне нужно также захватить UINavigationBar, потому что я хочу использовать изображение в качестве переходного слоя в моем UIStoryboardSegue.Есть идеи?

Ответы [ 4 ]

7 голосов
/ 22 января 2012

Используйте окно вашего представления в качестве представления, поэтому также будут включены панель навигации и строка состояния. Если вам нужно удалить строку состояния, вам придется обрезать изображение.

3 голосов
/ 20 сентября 2015

Вы должны сделать скриншот self.navigationController? .View. Таким образом, вы получите весь вид с навигационной панелью, но без строки состояния.

if let view = self.navigationController?.view {
    let snapshot = view.snapshotViewAfterScreenUpdates(false)
}
2 голосов
/ 20 января 2014

вместо view.layer укажите ссылку на appdelegate.window.layer, он будет работать.

0 голосов
/ 19 августа 2016

Ничего себе, на самом деле ни один из этих ответов не работает. Вот как вы делаете это, чтобы получить скриншот всего, включая контроллер навигации

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

}
...