Ошибка UIImagePickerController: моментальный снимок, который не был отображен, приводит к пустым моментальным снимкам в iOS 7

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

Snapshotting a view that has not been rendered results in an empty snapshot. Ensure your view has been rendered at least once before snapshotting or snapshot after screen updates.

Вот что я делаю.

imagePicker = [[UIImagePickerController alloc] init];
[imagePicker setDelegate:self];
[imagePicker setSourceType:UIImagePickerControllerSourceTypeCamera];
[imagePicker setAllowsEditing:YES];

[self presentModalViewController:imagePicker animated:YES];

Я попытался задержать текущийModalViewController, но я все равно получаю то же сообщение. Через несколько секунд (7-10) приложение потерпело крах.

Эта ошибка присутствует только в iOS 7.

У кого есть ключ? Заранее благодарю вас.

Ответ 1

Проблема в iOS7 связана с переходами. Похоже, что если предыдущий переход не завершился, и вы запустили новый, iOS7 испортил представления, где iOS6, похоже, правильно управляет.

Вы должны инициализировать свою камеру в UIViewController, только после того, как представление загрузилось и с таймаутом:

- (void)viewDidAppear:(BOOL)animated 
{
    [super viewDidAppear:animated];
    //show camera...
    if (!hasLoadedCamera)
        [self performSelector:@selector(showcamera) withObject:nil afterDelay:0.3];
}

и вот код инициализации

- (void)showcamera {
    imagePicker = [[UIImagePickerController alloc] init];
    [imagePicker setDelegate:self];
    [imagePicker setSourceType:UIImagePickerControllerSourceTypeCamera];
    [imagePicker setAllowsEditing:YES];

    [self presentModalViewController:imagePicker animated:YES];
}

Ответ 2

Эта ошибка также появилась для меня с проектом кода Apple PhotoPicker.

Я использовал Xcode Version 5.0 и iOS 7.0.3 на iPhone 4.

Шаги по воспроизведению:

  • Загрузите образец образца Apple PhotoPicker в https://developer.apple.com/library/ios/samplecode/PhotoPicker/Introduction/Intro.html

  • В APLViewController.m Вывод строки 125

    //imagePickerController.showsCameraControls = NO;

  • В APLViewController.m прокомментируйте строки 130-133

    //[[NSBundle mainBundle] loadNibNamed:@"OverlayView" owner:self options:nil];
    // self.overlayView.frame = imagePickerController.cameraOverlayView.frame;
    // imagePickerController.cameraOverlayView = self.overlayView;
    // self.overlayView = nil;

  • Создайте и запустите приложение.

  • После запуска поверните устройство в альбомный режим.

  • Щелкните значок камеры, чтобы открыть UIImagePickerController в режиме камеры.

  • Просмотр вывода консоли.

Консольный выход

PhotoPicker [240: 60b] Снимок снимка, который не был отображен, приводит к пустым моментальным снимкам. Убедитесь, что ваше представление было просмотрено как минимум один раз перед моментальным снимком или моментальным снимком после обновлений экрана.

показывает свойствоCameraControls

Проблема возникает для меня, когда это значение имеет значение YES (по умолчанию).

Устанавливая это значение НЕТ, исключено сообщение.

Отчет об ошибке

Я только что опубликовал отчет об ошибке с Apple.

Я пробовал много предложений, которые были сделаны в разных сообщениях, но не нашел удовлетворительного обходного пути.

Ответ 3

У меня возникла проблема, когда я попытался представить обзор камеры внутри popover. В iOS6 это не проблема, но в iOS7 я получил сообщение

Snapshotting a view that has not been rendered results in an empty snapshot. Ensure your view has been rendered at least once before snapshotting or snapshot after screen updates.

.

Однако после того, как я изменил представление камеры на полноэкранный режим, как описано в Съемка фотографий и фильмов, библиотека разработчиков iOS, все прошло отлично и сообщение больше не появлялось. Однако я должен был убедиться, что в зависимости от того, в каком режиме приложение (т.е. Представляет просмотр камеры или бросок фото), мне приходилось либо отклонять popover, либо контроллер вида всякий раз, когда вызывался метод - (void) imagePickerControllerDidCancel: (UIImagePickerController *) picker.

Ответ 4

создать свойство

@property (nonatomic) UIImagePickerController *imagePickerController;

Тогда

UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.delegate = self;
picker.modalPresentationStyle = UIModalPresentationCurrentContext;
picker.sourceType = UIImagePickerControllerSourceTypeCamera;
picker.allowsEditing = YES;
self.imagePickerController = picker;
[self presentViewController:self.imagePickerController animated:YES completion:nil];

Это должно решить проблему

Ответ 5

Я использовал этот код для устранения проблемы:

UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
[imagePicker setSourceType:UIImagePickerControllerSourceTypeCamera];
[imagePicker setDelegate:self];

if ([self respondsToSelector:@selector(presentViewController:animated:completion:)]){
    [imagePicker setShowsCameraControls:NO];
    [self presentViewController:imagePicker animated:YES completion:^{
        [imagePicker setShowsCameraControls:YES];
    }];
} else {
    [imagePicker setShowsCameraControls:YES];
    [self presentModalViewController:imagePicker animated:YES];
}

Ответ 6

У меня такая же проблема и нашел решение. Я думаю, эта ошибка связана с ориентацией вашего приложения. Мое приложение использует только ландшафтный режим, но UIImagePickerController использует портретный режим. Я добавляю блок try-catch в main.m и получаю реальное исключение:

Supported orientations has no common orientation with the application, and shouldAutorotate is returning YES

Как я могу решить эту проблему:

1) Повторно проверьте ориентацию устройства в Target- > General или .plist: Поддерживаемые ориентации интерфейса: Пейзаж слева, Пейзаж справа.

2) Добавить в AppDelegate.m:

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {
    return UIInterfaceOrientationMaskLandscape | UIInterfaceOrientationMaskPortrait;
}

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

3) Создайте категорию для UINavigationController, (supportInterfaceOrientations переместился из UIViewController в UINavigationController в iOS6):

@implementation UINavigationController (RotationIOS6)

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskLandscape;
}

@end

Это решение работает правильно на iOS 6.0, 6.1, 7.0. Надеюсь, это поможет.

Ответ 7

Я получаю эту ошибку при создании приложения с iOS SDK 6.1, целевым развертыванием iOS 6.1 и запуском приложения на iPhone под управлением iOS 7. Приложение не падает, но метод UIViewController shouldAutorotate помогает мне удалить сообщение об ошибке.

- (BOOL)shouldAutorotate {
    return YES;
}

Ответ 8

У меня была такая же проблема, когда я пытался изменить демонстрационное приложение, которое поставляется с Avirary SDK, в демонстрационном приложении он может редактировать только фотографии, выбранные из рулона камеры. Чтобы попытаться отредактировать фотографию, выполнив захват с камеры, я сначала добавил следующий код в файл UIViewcontroller.m:

#pragma mark - Take Picture from Camera
- (void)showCamera
{
//[self launchPhotoEditorWithImage:sampleImage highResolutionImage:nil];

    if ([self hasValidAPIKey]) {
        UIImagePickerController * imagePicker = [UIImagePickerController new];
        [imagePicker setSourceType:UIImagePickerControllerSourceTypeCamera];
        [imagePicker setDelegate:self];
        [imagePicker setAllowsEditing:YES]; //important, must have

        if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
            [self presentViewController:imagePicker animated:YES completion:nil];
        }else{
            [self presentViewControllerInPopover:imagePicker];
        }
    }
}

Затем, когда я запустил приложение, произошла ошибка:

Snapshotting a view that has not been rendered results in an empty snapshot. Ensure your view has been rendered at least once before snapshotting or snapshot after screen updates.

Чтобы решить эту ошибку, измените делегат UIImagePicker в файле UIViewContooler.m, как показано ниже:

#pragma mark - UIImagePicker Delegate

- (void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    NSURL * assetURL = [info objectForKey:UIImagePickerControllerReferenceURL];

    void(^completion)(void)  = ^(void){

        [[self assetLibrary] assetForURL:assetURL resultBlock:^(ALAsset *asset) {
            if (asset){
                [self launchEditorWithAsset:asset];
            }
        } failureBlock:^(NSError *error) {
            [[[UIAlertView alloc] initWithTitle:@"Error" message:@"Please enable access to your device photos." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] show];
        }];

        UIImage * editedImage = [info objectForKey:UIImagePickerControllerEditedImage];
        if(editedImage){
            [self launchPhotoEditorWithImage:editedImage highResolutionImage:editedImage];
        }

    };

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
        [self dismissViewControllerAnimated:YES completion:completion];
    }else{
        [self dismissPopoverWithCompletion:completion];
    }

}    

Затем ошибка исчезла, и приложение работает!

Ответ 9

Попробуйте это, используйте

[self performSelector:@selector(presentCameraView) withObject:nil afterDelay:1.0f];

и функция

-(void)presentCameraView{
    [self presentViewController:imagePicker animated:YES completion:nil];
}

для замены. [self presentModalViewController:imagePicker animated:YES]; и причины make imagePicker в качестве глобальной переменной.

Ответ 10

Это то, что исправлено для меня в моем приложении, ymmv

сначала это приложение для iPhone - iPad

в appname-Info.plist. в поддерживаемых интерфейсах (iPad) показано 4 ориентации.

в поддерживаемых ориентациях интерфейса показаны 3 ориентации. Я добавил четвертый и запустил приложение, без вывода отладки.

Надеюсь, что это поможет.

Ответ 11

Я только что столкнулся с той же проблемой. В моем случае проблема заключалась в том, что у меня был не-ARC-код, и я перенес его в ARC. Когда я сделал миграцию, я не содержал сильной ссылки на UIImagePickerController, и это стало причиной сбоя.

Надеюсь, это поможет:)

Ответ 12

У меня была такая же проблема в iOS 8, но доступ к Camera был отключен внутри Настройки → Конфиденциальность для моего приложения. Просто включил его, и он работал.

Ответ 13

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

Вот что вы сделаете, чтобы получить выбранное изображение и возобновить работу:)

-(void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary*)info
{
    UIImage* pickedImage = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
    [composeImageView setImage:pickedImage];
[picker dismissViewControllerAnimated:YES completion:nil];
 }

Да, чтобы решить эту проблему, вам нужно просто отключить сборщик, как кажется, это сообщение: "Снимок снимка, который не был визуализирован, приводит к пустым моментальным снимкам. Убедитесь, что ваше представление было просмотрено как минимум один раз перед моментальным снимком или моментальный снимок после обновления экрана". останавливает сборщик от реагирования, но вы можете отменить его и получить изображение в обычном режиме.

Ответ 14

В моем случае это было связано с изменением компоновки: VC, представляющий UIImagePickerViewController, скрывает строку состояния, но UIImagePickerViewController не имеет.

Итак, я решил, что он скрывает строку состояния в UIImagePickerViewController, как показано в этом answer.

Ответ 15

Непосредственно отвечая на ваш вопрос, но вы упомянули, что у вас есть предупреждение о памяти, вы можете хранить исходное изображение в свойстве, которое может привести к предупреждению памяти. Это связано с тем, что необработанное изображение занимает примерно 30 МБ памяти. Я заметил аналогичное предупреждение о памяти при тестировании приложений на iOS6, которые были на iPhone 4 серии. Я получил это предупреждение, когда устройства были обновлены до iOS7. Предупреждение о сохранности памяти при тестировании на iPhone 5 серии на iOS7 отсутствует.

Ответ 16

Изменение

[self presentViewController:imagePicker animated:YES completion:nil];

to

[self presentViewController:imagePicker animated:YES completion:NULL];

исправил проблему для меня.