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:^{

}];

любая идея?

Ответ 1

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

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

Ответ 2

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

Ответ 3

У меня недостаточно очков репутации, чтобы прокомментировать ответ @greg выше, поэтому добавим мои замечания здесь. У меня есть проект Swift для iPad и iPhone. У меня есть метод внутри моего главного контроллера представления (соответствующий бит ниже). Когда я тестирую это на телефоне, все работает правильно и никаких предупреждений не генерируется. Когда я запускаю его на iPad, все работает правильно, но я вижу предупреждение о снимке изображения. Интересный бит, однако, заключается в том, что когда я запускаю iPad без использования контроллера 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);
        }
    });

Ответ 4

Я столкнулся с этим после вызова UIImagePickerController presentViewController: от обратного вызова к делегату UIAlertView. Я решил проблему, нажав presentViewController: отменил текущую трассировку выполнения, используя 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];
    });
}

Ответ 5

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

- (void)applicationWillResignActive:(UIApplication *)application

и YES в

- (void)applicationDidBecomeActive:(UIApplication *)application

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

Ответ 6

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

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

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

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

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

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

[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:^(){
}];}

Ответ 7

Вы можете отключить предупреждение "Снимок снимка", указав свойство view перед представлением контроллера вида. Это приводит к загрузке представления и позволяет 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];

Ответ 8

Для тех, кто видит проблему с черным предварительным просмотром после захвата изображения, скрытие строки состояния после показа 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];
            }
        }];

Ответ 9

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

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

Ответ 10

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

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

Ответ 11

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

imagePicker.modalPresentationStyle = UIModalPresentationStyle.OverCurrentContext

Ответ 12

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

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

Ответ 13

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

[yourViewBeingPresented.view layoutIfNeeded];

Ответ 14

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

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

Ответ 15

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

Ответ 16

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

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

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

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

Ответ 17

Я использую Phonegap, но этот поток продолжает появляться как первый, когда 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});

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

Ответ 18

В качестве альтернативы рассмотрите использование 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;
}

Также смотрите:

Ответ 19

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

Ответ 20

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