iOS 8 Снимок снимка, который не был отображен, приводит к созданию пустого моментального снимка

В iOS 8 у меня проблема с захватом изображений с камеры до сих пор, я использую этот код для

UIImagePickerController *controller=[[UIImagePickerController alloc] init]; controller.videoQuality=UIImagePickerControllerQualityTypeMedium; controller.delegate=(id)self; controller.sourceType=UIImagePickerControllerSourceTypeCamera; [self presentViewController:controller animated:YES completion:nil]; 

Но в iOS 8 я получаю следующее:

 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. 

Я попытался с решением, предоставленным This Post с

 @property (strong,nonatomic)UIImagePickerController *controller; _controller=[[UIImagePickerController alloc] init]; _controller.videoQuality=UIImagePickerControllerQualityTypeMedium; _controller.delegate=(id)self; _controller.sourceType=UIImagePickerControllerSourceTypeCamera; _[self presentViewController:controller animated:YES completion:nil]; 

и это

 ... controller.modalPresentationStyle=UIModalPresentationFullScreen; or controller.modalPresentationStyle=UIModalPresentationCurrentContext; ... 

и это

 double delayInSeconds = 0.1; dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ [self presentViewController:controller animated:YES completion:nil]; }); 

и это

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

и это

 [self presentViewController:controller animated:YES completion:^{ }]; 

Есть идеи?

Я уверен, что это всего лишь ошибка в iOS 8.0. Он воспроизводится с помощью самых простых приложений POC, которые делают не что иное, как попытку представить UIImagePickerController как вы делаете это выше. Насколько мне известно, альтернативы шаблону / фотоаппарату нет. Вы даже можете скачать приложение Apple с использованием UIImagePickerController , запустите его, и он будет генерировать ту же ошибку из коробки.

Тем не менее, функциональность все еще работает для меня. Помимо предупреждения / ошибки, есть ли у вас проблемы с функционированием вашего приложения?

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

У меня недостаточно очков репутации, чтобы прокомментировать ответ @ greg выше, поэтому добавим мои замечания здесь. У меня есть проект Swift для iPad и iPhone. У меня есть метод внутри моего главного controllerа представления (соответствующий бит ниже). Когда я тестирую это на телефоне, все работает правильно и никаких предупреждений не генерируется. Когда я запускаю его на iPad, все работает правильно, но я вижу предупреждение о снимке изображения. Интересный бит, однако, заключается в том, что когда я запускаю iPad без использования controllerа popover, все работает нормально, без предупреждения. К сожалению, Apple заявляет, что сборщик изображений должен использоваться внутри iPad на iPad, если камера не используется.

  dispatch_async(dispatch_get_main_queue(), { let imagePicker: UIImagePickerController = UIImagePickerController(); imagePicker.sourceType = UIImagePickerControllerSourceType.SavedPhotosAlbum; imagePicker.mediaTypes = [kUTTypeImage]; imagePicker.allowsEditing = false; imagePicker.delegate = self; if(UIDevice.currentDevice().userInterfaceIdiom == .Pad){ // on a tablet, the image picker is supposed to be in a popover let popRect: CGRect = buttonRect; let popover: UIPopoverController = UIPopoverController(contentViewController: imagePicker); popover.presentPopoverFromRect(popRect, inView: self.view, permittedArrowDirections: UIPopoverArrowDirection.Up, animated: true); }else{ self.presentViewController(imagePicker, animated: true, completion: nil); } }); 

Я столкнулся с этим после вызова UIImagePickerController presentViewController: от обратного вызова к делегату UIAlertView. Я решил проблему, нажав currentViewController: отменил текущую трассировку выполнения, используя dispatch_async.

 - (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex { dispatch_async(dispatch_get_main_queue(), ^{ UIImagePickerController *imagePickerController = [[UIImagePickerController alloc] init]; imagePickerController.delegate = self; if (buttonIndex == 1) imagePickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; else imagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera; [self presentViewController: imagePickerController animated: YES completion: nil]; }); } 

У меня была эта проблема при анимации некоторых просмотров, и приложение перешло в фоновый режим и вернулось. Я обработал его, установив флаг isActive. Я установил его в NO

 - (void)applicationWillResignActive:(UIApplication *)application 

и ДА в

 - (void)applicationDidBecomeActive:(UIApplication *)application 

и оживить или не оживить мои взгляды соответственно. Позаботился об этом.

У меня было это с UIAlertControllerStyleActionSheet, дающим пользователю возможность снимать фотографию с помощью камеры или использовать ее из библиотеки.

Я попробовал символическую точку останова в сообщении об ошибке введите описание изображения здесь

Это показало, что ошибка возникает при использовании межсетевого интерфейса UICollectionView во время презентации

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

введите описание изображения здесь

Я исправил это, выразив установку frameworks перед представлением

 [alert setPreferredContentSize: alert.view.frame.size]; 

Вот полный метод, который работает без ошибки

 -(void)showImageSourceAlertFromSender:(id)sender{ UIButton *senderButton = (UIButton*)sender; UIAlertController *alert = [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:UIAlertControllerStyleActionSheet]; UIAlertAction *cameraAction = [UIAlertAction actionWithTitle:@"Camera" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { [self takePhoto]; }]; UIAlertAction *libraryAction = [UIAlertAction actionWithTitle:@"Library" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { [self selectPhotoFromLibraryFromSender:sender]; }]; [alert addAction:cameraAction]; [alert addAction:libraryAction]; alert.popoverPresentationController.delegate = self; alert.popoverPresentationController.sourceRect = senderButton.frame; alert.popoverPresentationController.sourceView = self.view; [alert setPreferredContentSize: alert.view.frame.size]; [self presentViewController:alert animated:YES completion:^(){ }];} 

Вы можете отключить предупреждение «Снимок снимка», указав свойство view перед представлением controllerа вида. Это приводит к тому, что представление загружается и позволяет iOS выполнять его перед тем, как делать снимок.

 UIAlertController *controller = [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:UIAlertControllerStyleActionSheet]; controller.modalPresentationStyle = UIModalPresentationPopover; controller.popoverPresentationController.barButtonItem = (UIBarButtonItem *)sender; ... setup the UIAlertController ... [controller view]; // <--- Add to silence the warning. [self presentViewController:controller animated:YES completion:nil]; 

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

 UIImagePickerControllerSourceType source = [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera] ? UIImagePickerControllerSourceTypeCamera : UIImagePickerControllerSourceTypeSavedPhotosAlbum; UIImagePickerController *cameraController = [[UIImagePickerController alloc] init]; cameraController.delegate = self; cameraController.sourceType = source; cameraController.allowsEditing = YES; [self presentViewController:cameraController animated:YES completion:^{ //iOS 8 bug. the status bar will sometimes not be hidden after the camera is displayed, which causes the preview after an image is captured to be black if (source == UIImagePickerControllerSourceTypeCamera) { [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone]; } }]; 

Я нашел ту же проблему и все пробовал. У меня есть два разных приложения: один в объективе C и один в быстром – оба имеют одну и ту же проблему. Сообщение об ошибке появляется в отладчике, и после первой фотографии экран становится черным. Это происходит только в iOS> = 8.0, очевидно, это ошибка.

Я нашел трудное обходное решение. Отключите элементы управления камерой с помощью imagePicker.showsCameraControls = false и создайте собственное оверлейное изображение с отсутствующими кнопками. Как это сделать. Странное сообщение об ошибке остается, но по крайней мере экран не становится черным, и у вас есть рабочее приложение.

Это может быть ошибкой встроенного ImagePickerController. Мой код работает, но время от времени падает на iPhone 6 Plus.

Я пробовал все решения, предлагаемые другими ответами, но не было никакой удачи. Проблема окончательно решена после переключения на JPSImagePickerController .

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

 imagePicker.modalPresentationStyle = UIModalPresentationStyle.OverCurrentContext 

Я уверен, что это всего лишь ошибка в iOS 8.0. Он воспроизводится с помощью самых простых приложений POC, которые делают не что иное, как попытку представить UIImagePickerController, как вы делаете это выше. Насколько мне известно, альтернативы шаблону / фотоаппарату нет. Вы даже можете скачать приложение Apple с использованием UIImagePickerController, запустите его, и он будет генерировать ту же ошибку из коробки.

Тем не менее, функциональность все еще работает для меня. Помимо предупреждения / ошибки, есть ли у вас проблемы с функционированием вашего приложения?

Если мы используем UIImagePickerController как свойство, это предупреждение исчезнет. xcode предполагает, что мы не используем результат от UIImagePickerController , если мы UIImagePickerController внутри функции.

Вызов этого метода сработал для меня. Поместите его после представления своего вида.

 [yourViewBeingPresented.view layoutIfNeeded]; 

Я также сталкиваюсь с той же проблемой, и я разрешил ее, проверив, доступна ли камера:

 BOOL cameraAvailableFlag = [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]; if (cameraAvailableFlag) [self performSelector:@selector(showcamera) withObject:nil afterDelay:0.3]; 

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

У меня такая же ошибка, и я получаю сообщение в консоли при открытии камеры.

«Снимок снимка, который не был отображен, приводит к пустым моментальным снимкам. Убедитесь, что ваше представление было просмотрено как минимум один раз перед моментальным снимком или моментальным снимком после обновления экрана. ‘

Для меня проблема была в отображаемом имени Bundle в файле Info.plist.it был пуст каким-то образом, я поставил там свое имя приложения, и теперь он работает отлично. I did’t получил предупреждение о разрешении камеры из-за пустого отображения отображения name.it заблокировал представление из рендеринга.

проблема была не с точки зрения, а путем представления ее без разрешения. Вы можете проверить ее на настройках -> privacy -> Camera, если ваше приложение не указано там, проблема может быть одинаковой.

Я использую Phonegap, но этот stream продолжает оставаться первым, когда Googling сообщает об ошибке.

Для меня этот вопрос ушел, определив тип imagitype в PNG.

 encodingType : Camera.EncodingType.PNG 

Таким образом, вся строка:

  navigator.camera.getPicture(successFunction, failFunction, { encodingType : Camera.EncodingType.PNG, correctOrientation:true, sourceType : Camera.PictureSourceType .PHOTOLIBRARY, quality: 70, allowEdit : false , destinationType: Camera.DestinationType.DATA_URL}); 

Ваш пробег может отличаться, но это сделало трюк для меня.

В качестве альтернативы рассмотрим использование drawViewHierarchyInRect :

Swift:

 extension UIImage{ class func renderUIViewToImage(viewToBeRendered: UIView) -> UIImage { UIGraphicsBeginImageContextWithOptions(viewToBeRendered.bounds.size, true, 0.0) viewToBeRendered.drawViewHierarchyInRect(viewToBeRendered.bounds, afterScreenUpdates: true) viewToBeRendered.layer.renderInContext(UIGraphicsGetCurrentContext()!) let finalImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return finalImage } } 

Objective-C:

 - (UIImage *)snapshot:(UIView *)view { UIGraphicsBeginImageContextWithOptions(view.bounds.size, YES, 0); [view drawViewHierarchyInRect:view.bounds afterScreenUpdates:YES]; UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return image; } 

Также см:

В моем случае (XCode 7 и iOS 9) я использую UINavigationController «скрытый», поэтому я должен добавить UINavigationControllerDelegate чтобы представить камеру или рулон, и она работает так, как предполагается! And pickerControllerDelegate.self тоже не отображает ошибку!

  • MKAnnotation, простой пример
  • NSMutableArray addObject не влияет на счет?
  • Почему NSUserDefaults не удалось сохранить NSMutableDictionary в iPhone SDK?
  • Как изменить определенный цвет в изображении?
  • Как сделать ui отзывчивым все время и делать обновление фона?
  • Проверка доступности iPhone
  • Легкий способ убрать клавиатуру?
  • Неверное завершение кода Xcode 6 не работает
  • Округленный UIView с использованием CALayers - только некоторые углы - как?
  • Получение случайного объекта из NSArray без дублирования
  • UIScrollView - показывает полосу прокрутки
  • Давайте будем гением компьютера.