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 с
- Как обнаружить паузу во вводе для UISearchBar / UITextField?
- Как добавить 1 день к NSDate?
- 2D-массивы с использованием NSMutableArray
- Создать случайное число в пределах диапазона?
- NSMutableArray addObject не работает
@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:^{ }];
Есть идеи?
- Точка с запятой после имени метода в файле реализации Objective-C
- Как запустить UITableView на последней ячейке?
- View-based NSTableView с строками с динамическими высотами
- Почему я не должен использовать Objective C 2.0-аксессоры в init / dealloc?
- UITableView, прокрутите вниз до перезагрузки?
- Округлые углы только на вершине UIView
- Формирование портретной ориентации при нажатии на альбомный режим.
- Почему мой коллега MCSession отключается случайно?
Я уверен, что это всего лишь ошибка в 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; }
Также см:
- https://developer.apple.com/library/ios/qa/qa1817/_index.html
- Как захватить UIView в UIImage без потери качества на дисплее сетчатки
В моем случае (XCode 7 и iOS 9) я использую UINavigationController
«скрытый», поэтому я должен добавить UINavigationControllerDelegate
чтобы представить камеру или рулон, и она работает так, как предполагается! And pickerControllerDelegate.self
тоже не отображает ошибку!