it-swarm.com.ru

Ошибка 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];

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

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

У кого-нибудь есть подсказка? Заранее спасибо.

102
Didats Triadi

Проблема в 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];
}
32
Lefteris

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

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

Действия по воспроизведению:

  1. Загрузите образец проекта Apple PhotoPicker по адресу https://developer.Apple.com/library/ios/samplecode/PhotoPicker/Introduction/Intro.html

  2. В APLViewController.m закомментируйте строку 125

    //imagePickerController.showsCameraControls = NO;

  3. В 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;

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

  5. После запуска переведите устройство в ландшафтный режим.

  6. Нажмите значок камеры, чтобы открыть UIImagePickerController в режиме камеры.

  7. Посмотреть вывод консоли.

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

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

showsCameraControls свойство

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

Установка этого значения в NO исключает сообщение.

Сообщение об ошибке

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

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

18
Scott Carter

У меня возникла проблема, когда я попытался представить вид камеры внутри поповера. Под 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 все снова прошло нормально, и сообщение больше не появлялось. Однако я должен был убедиться в том, что в зависимости от того, в каком режиме находится приложение (то есть представление камеры или фотопленка), мне приходилось либо отключать поповер, либо контроллер просмотра всякий раз, когда вызывался метод - (void) imagePickerControllerDidCancel: (UIImagePickerController *) picker.

11
Arne

создать собственность 

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

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

6
Asfanur

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

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];
}
4
Germán Marquès

У меня возникла та же проблема, когда я пытался изменить демонстрационное приложение, поставляемое с 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's 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];
    }

}    

Тогда ошибка исчезла и приложение работает!

3
Tony

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

- (BOOL)shouldAutorotate {
    return YES;
}
3
Grigori A.

У меня та же проблема, и я нашел решение. Я думаю, что эта ошибка связана с ориентацией вашего приложения. Мое приложение использует только альбомный режим, но 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. Надеюсь это поможет.

3
Roman Ermolov

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

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

и функция

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

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

1
JerryZhou

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

прежде всего, это приложение для iPhone - iPad

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

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

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

1
user1045302

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

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

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

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

0
DevSherif

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

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

0
arturgrigor

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

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

0
kanobius

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

0
BhushanVU