iOS: можно ли сделать снимок экрана-заставки?

Я пытался захватить и сохранить изображение заставки внутри application:didFinishLaunchingWithOptions:, используя следующий код:

UIWindow *w = [[[UIApplication sharedApplication] windows] firstObject];

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

NSString *applicationDocumentsDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
time_t unixTime = (time_t) [[NSDate date] timeIntervalSince1970];
NSString *storePath = [NSString stringWithFormat:@"%@/%ld.png", applicationDocumentsDir, unixTime];
[UIImagePNGRepresentation(img) writeToFile:storePath atomically:YES];

Однако, к сожалению, изображение сохраняется как прозрачное изображение. Вероятно, это потому, что мой объект UIWindow не тот. Может ли кто-нибудь направить меня в успех с этим?


person ishahak    schedule 09.01.2017    source источник


Ответы (2)


Почему бы вам не попробовать приведенный ниже код после установки идентификатора раскадровки для контроллера файлового представления LaucnhScreen.storyboard.

UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"LaunchScreen"
                                                             bundle: nil];

    UIViewController *controller = (UIViewController*)[mainStoryboard
                                                       instantiateViewControllerWithIdentifier: @"Launch"];
    UIGraphicsBeginImageContext(w.bounds.size);
    [controller.view.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    NSString *applicationDocumentsDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    time_t unixTime = (time_t) [[NSDate date] timeIntervalSince1970];
    NSString *storePath = [NSString stringWithFormat:@"%@/%ld.png", applicationDocumentsDir, unixTime];
    [UIImagePNGRepresentation(img) writeToFile:storePath atomically:YES];
person Vishnuvardhan    schedule 09.01.2017
comment
Спасибо за ответ, но это не ответ на мой вопрос. Мой экран-заставка основан на статических изображениях, а не на раскадровке. Я не могу изменить его для проекта, над которым работаю - person ishahak; 14.01.2017

Относительно ответа UIApplicationDelegate обычно имеет ссылку на "главное окно":

[[[UIApplication sharedApplication] delegate] window];
person miletliyusuf    schedule 09.01.2017
comment
Спасибо за ответ, но это окно не имеет доступа к заставке - person ishahak; 14.01.2017