Ошибка UIImagePickerController: Snapshotting представление, которое не было отображено приводит к пустой снимок в 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.
у кого-нибудь есть ключ? Спасибо продвижение.
16 ответов:
проблема в 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]; }
эта ошибка также появилась для меня с примером кода проекта Apple PhotoPicker.
я использовал Xcode версии 5.0 и iOS 7.0.3 на iPhone 4.
воспроизведение:
загрузите образец проекта Apple PhotoPicker по адресу https://developer.apple.com/library/ios/samplecode/PhotoPicker/Introduction/Intro.html
В APLViewController.м закомментировать строку 125
//imagePickerController.showsCameraControls = NO;В APLViewController.м закомментировать строки 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] Snapshotting представление, которое не было оказано приводит к пустой снимок. Убедитесь, что ваше представление было отображено по крайней мере один раз перед snapshotting или snapshot после обновления экрана.
свойство showsCameraControls
проблема возникает для меня, когда это имеет значение YES (по умолчанию).
установка этого значения не устранена сообщение.
сообщить об ошибке
Я только что подал отчет об ошибке с Apple.
Я пробовал многие из предложений, которые были сделаны в разных сообщениях, но не нашли удовлетворительного решения.
Я получил проблему, когда я попытался представить вид камеры внутри 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называлась.
создать свойство
@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];Это должно решить проблему
я использовал этот код для решения проблемы:
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]; }
у меня та же проблема, и я нашел решение. Я думаю, что ошибка связана с ориентацией вашего приложения. Мое приложение использует только ландшафтный режим, но UIImagePickerController использует портретный режим. Я добавляю блок try-catch в main.м, и получить реальное исключение:
Supported orientations has no common orientation with the application, and shouldAutorotate is returning YESкак я решаю эту проблему:
1) Проверьте ориентацию устройства в Target->General, or .plist файл: поддерживаемые ориентации интерфейса : пейзаж слева, пейзаж справа.
2) Добавить AppDelegate.м:
- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window { return UIInterfaceOrientationMaskLandscape | UIInterfaceOrientationMaskPortrait; }после этого шага UIImagePickerController работает правильно, но мои viewcontrollers можно повернуть в портретный режим. Итак, чтобы решить эту проблему:
3) Создайте категорию для UINavigationController, (supportedInterfaceOrientations перемещены из UIViewController в UINavigationController в iOS6):
@implementation UINavigationController (RotationIOS6) - (NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskLandscape; } @endЭто решение работает корректно на iOS 6.0, 6.1, 7.0. Надеюсь, это поможет.
Я получаю эту ошибку при создании приложения с iOS SDK 6.1, развертывания целевой iOS 6.1 и запуска приложения на iOS 7 питание iPhone. Приложение не сбой, но реализация
UIViewController shouldAutorotateспособ помогает мне удалить сообщение об ошибке.- (BOOL)shouldAutorotate { return YES; }
у меня была такая же проблема, когда я пытался изменить демо-приложение, которое поставляется с Avirary SDK, в демонстрационном приложении он может редактировать только фотографию, выбранную из рулона камеры. Чтобы попытаться отредактировать фотографию, захватив ее с камеры, я сначала добавил следующий код в UIViewcontroller.файл м:
#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]; } }потом ошибка исчезла и приложение работает!
попробуйте использовать
[self performSelector:@selector(presentCameraView) withObject:nil afterDelay:1.0f];и
-(void)presentCameraView{ [self presentViewController:imagePicker animated:YES completion:nil]; }заменить.
[self presentModalViewController:imagePicker animated:YES];и причины делаютimagePickerкак глобальная переменная.
Это то, что исправил его для меня на моем приложении, ymmv
во - первых, это приложение для iPhone-iPad
в appname-Info.файл plist. в поддерживаемом интерфейсе orientations (iPad) показаны 4 ориентации.
в поддерживаемом интерфейсе ориентации показали 3 ориентации. Я добавил четвертый и запустил приложение, без вывода отладки.
надеюсь, что это помогает.
Я только что столкнулся с такой же проблемой. В моем случае проблема заключалась в том, что у меня был некоторый код без дуги, и я перенес его в ARC. Когда я делал миграцию, я не держал сильную ссылку на
UIImagePickerControllerи это стало причиной аварии.надеюсь, что это помогает :)
У меня была такая же проблема в iOS 8, но доступ к камере был отключен внутри Настройки--> Конфиденциальность для моего приложения. Просто включил его, и он работал.
Я потратил много времени, пытаясь найти решение, и удивительно, что я нашел его в конце, и это было просто очень смешно, как только я его обнаружил.
вот что вы будете делать, чтобы восстановить изображение, которое вы выбрали и возобновить работу :)
-(void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary*)info { UIImage* pickedImage = [info objectForKey:@"UIImagePickerControllerOriginalImage"]; [composeImageView setImage:pickedImage]; [picker dismissViewControllerAnimated:YES completion:nil]; }да, чтобы решить эту проблему, вам нужно только отклонить средство выбора обычно, как кажется, это сообщение: "Snapshotting представление, которое не было отображено, приводит к пустому снимку. Убедитесь, что ваше представление было отображено хотя бы один раз перед мгновенных снимков или снимок после обновления экрана."останавливает выбор от того, чтобы быть отзывчивым, но вы можете отклонить его и получить изображение нормально.
в моем случае это было связано с изменением макета: VC, представляющий
UIImagePickerViewControllerимеет скрытую строку состояния, ноUIImagePickerViewControllerнет.Итак, я решил его, скрывая строку состояния в
UIImagePickerViewControllerкак показано в этой ответ.
не отвечая непосредственно на ваш вопрос, но вы упомянули ,что у вас было предупреждение памяти, вы можете хранить необработанное изображение в свойстве, которое может привести к предупреждению памяти. Это связано с тем, что необработанное изображение занимает примерно 30 МБ памяти. Я заметил аналогичное предупреждение памяти при тестировании приложений на iOS6, которые были на iPhone 4 series. Я все еще получил это предупреждение, когда устройства были обновлены до iOS7. Нет предупреждения памяти при тестировании на iPhone 5 series на iOS7.
изменение
[self presentViewController:imagePicker animated:YES completion:nil];до
[self presentViewController:imagePicker animated:YES completion:NULL];Исправлена проблема для меня.
Comments