UIImagePickerController, показывающий черный экран предварительного просмотра

У меня возникла проблема при вызове UIImagePickerController для использования камеры. Иногда, но чаще, чем ни один, экран предварительного просмотра показывает, что он черный (поскольку сама камера закрыта). После некоторых исследований, кажется, люди, которые не делегируют это правильно. Однако, я считаю, что моя настройка правильная. Рестарт приложения - это то, что его исправляет.

В моем файле .h я включил UIImagePickerControllerDelegate и UINavigationControllerDelegate.

Вот код для файла .m

- (IBAction)camera:(id)sender {
        UIImagePickerController *imagePickerController = [[UIImagePickerController alloc] init];

    #if TARGET_IPHONE_SIMULATOR
        imagePickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
    #else
        imagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera;
    #endif
        imagePickerController.editing = YES;
        imagePickerController.delegate = self;
        [self presentViewController:imagePickerController animated:YES completion:nil];
    }

Любые идеи относительно того, почему это происходит?

Спасибо

Ответ 1

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

В приложении с несколькими контроллерами представлений, у которых есть 2000 строк кода, каждый из них может быть очень трудно отследить. Это то, что в конечном итоге привело меня к моему ответу, и ОЧЕНЬ быстро при этом.

https://gist.github.com/steipete/5664345

Этот парень опубликовал класс, который вы можете скачать и добавить в свой проект. Просто добавьте его в свой проект, вам не нужно использовать его нигде или пытаться создать экземпляр в любом месте, просто добавьте его в свой проект. Он также утверждает, что вы должны запускать это без ARC. Для этого перейдите на вкладку "Сборка фаз", разверните "Скомпилировать источники", дважды щелкните файл, а затем введите "fno-objc-arc"

Теперь запустите проект и перейдите к тому месту, где вы просматриваете экран предварительного просмотра черного изображения. Если все идет по плану, в какой-то момент до вашего приложения должно произойти сбой и сброс, чтобы утешить некоторую информацию о выполнении действия UIKit вне основного потока. Основываясь на том, что делает ваше приложение, и что было сброшено на консоль, вы должны очень быстро найти строку кода, вызывающую проблемы. В моем случае я смог вызвать обработчик ответа с помощью

[self performSelectorOnMainThread:@selector(handleResponse:) withObject:data waitUntilDone:true];

и моя проблема исчезла немедленно

Кроме того, эта проблема началась только после обновления iOS 7, я никогда не видел этого в iOS 5 или iOS 6.

Парень, разместивший файл, советует вам не отправлять ваше приложение с этим файлом, включенным в ваш проект, и я полностью согласен с этим.

Счастливая отладка!

Ответ 2

Попробуйте это. он решил мою проблему, убедитесь, что есть значение

(Имя приложения как строка) в info.plist > " Отображаемое имя пакета".

В моем случае он был пуст, и из-за этого он не работал.

Если в "info.plist" нет " Отображаемое имя пучка", добавьте строку с именем "Отображаемое имя пакета" и вставьте свое имя приложения.

Ответ 3

Проверьте это на своем устройстве. Я думаю, что вы тестируете его в симуляторе и допускаете свойствоImageEditing. Устаревшее в iOS 3.1, поэтому не используйте его.

Ответ 4

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

Если это то, с чем вы столкнулись, вы, скорее всего, увидите

<Warning>: CoreAnimation: warning, deleted thread with uncommitted CATransaction; set CA_DEBUG_TRANSACTIONS=1 in environment to log backtraces.

В журнале консоли

Сначала я столкнулся с этим, отпустив индикатор активности из другого потока (ошибка, которая я знаю). Но более коварно это ударило меня из-за загрузки файла nib в фоновом потоке (который вызывает [CATransaction setDisableActions:]... кто знал)

Включение схемы CA_DEBUG_TRANSACTIONS в вашей схеме, а затем запуск в вашем симуляторе при запуске системного журнала (tail -f /var/log/system.log) - действительно лучший способ узнать конкретного преступника.

Ответ 5

Попробуйте это...

dispatch_async(dispatch_get_current_queue(), ^(void){
    imagePicker.sourceType =
    UIImagePickerControllerSourceTypeCamera;
    imagePicker.delegate = self;
    [self presentModalViewController:imagePicker animated:YES];
    } ) ;

Ответ 6

Хотя это может быть проблемой, которая зависит от многих факторов, как видно из успешных решений, предоставляемых другими участниками, я думаю, стоит упомянуть о том, что пользователь мог запретить разрешения на использование камеры (в разделе "Конфиденциальность" > "Камера- > Ваше приложение), и, таким образом, камера показывает, но отображает черный экран предварительного просмотра. Это произошло со мной, и это зависело от ошибки на ранней стадии разработки, когда этот вопрос никогда не был замечен пользователем из-за перекрывающихся предупреждений.

Ответ 7

Когда вы создаете UIImagePickerController, измените cameraOverlayView на ноль. Это работало как прелесть для меня.

self.imagePickerController.cameraOverlayView = nil;

И это должно быть.

Ответ 8

Пожалуйста, проверьте [UIApplication sharedApplication].keyWindow.frame