Камера iDevice показывает черный вместо предварительного просмотра
Я разрабатываю приложение, которое захватывает изображения с камеры iDevice и загружает их в веб-службу.
НЕТ проблема, все работает нормально, кроме камеры устройства. Камера устройства сводит меня с ума. Я использую ниже код, чтобы пользователь мог записывать изображения. Иногда камера показывает предварительный просмотр, а иногда нет. Вместо предварительного просмотра просто отображается полная темнота на экране. Если я переключаюсь с тыла на переднюю камеру, начинает работать нормально. Я даже пытаюсь удалить все фоновые приложения с устройства и очистить столько памяти, сколько мог; до сих пор не повезло, и я застрял.: (
- (IBAction)addNewImage:(id)sender
{
UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
imagePicker.delegate = self;
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])
{
// Take picture from camera
imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
// set no to take as much pictures as user want.
imagePicker.showsCameraControls = YES;
// Show user the camera
[self presentModalViewController:imagePicker
animated:YES];
}
else
{
imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
[self presentModalViewController:imagePicker
animated:YES];
}
}
Ответы
Ответ 1
Я столкнулся с этой проблемой в своем приложении. Хотя я и не узнал, в чем проблема, я переписал свой код, чтобы определить свойство типа UIIMagePickerController
и инициализировать его один раз в getter. Использовал это свойство для инициализации вида камеры:
геттер:
-(UIImagePickerController *) imagePicker{
if(!_imagePicker){
_imagePicker = [[UIImagePickerController alloc] init];
_imagePicker.delegate = self;
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]){
_imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
}
else{
_imagePicker.sourceType =UIImagePickerControllerSourceTypePhotoLibrary;
}
}
return _imagePicker;
}
- (IBAction)addNewImage:(id)sender{
if (self.imagePicker)
{
[self presentViewController:self.imagePicker animated:YES completion:^{}];
}
}
По какой-то причине это избавилось от проблемы с предварительным просмотром, иногда показывающим черный экран
Ответ 2
У меня есть клиент, у которого была эта проблема. Они должны были выбрать, чтобы не разрешать доступ к камере. Мы должны были изменить настройку конфиденциальности камеры для приложения в настройках. Когда мы включили эту функцию, больше нет черного экрана камеры.
Ответ 3
Я столкнулся с одной и той же проблемой в iOS7 около месяца. После долгого перерыва обзора кода всего приложения я смог определить проблему.
Я перечислял
IBOutletCollection (UILabel) NSArray * staticLabelsCollection;
array Одновременное обновление текстов меток, которые выполнялись одновременно на нескольких потоках.
[self.labelsArr enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
UILabel * label = (UILabel*)obj;
label.text=[NSString stringWithFormat:@"%d",idx+2];
}];
Это создало проблему обновления элементов UIKit, отличных от основного потока.
Я смог уловить эту проблему, включив переменную окружения CA_DEBUG_TRANSACTIONS = 1 в Xcode, которая сгенерировала предупреждения в консоли устройства.
Nov 20 18:40:26 iPad2 CameraTest[1757] <Warning>: CoreAnimation: warning, deleted thread with uncommitted CATransaction; created by:
0 QuartzCore 0x32a553b3 <redacted> + 266
1 QuartzCore 0x32a55269 <redacted> + 224
2 QuartzCore 0x32a56871 <redacted> + 24
3 QuartzCore 0x32a56eed <redacted> + 40
4 QuartzCore 0x32a619ed <redacted> + 412
5 QuartzCore 0x32a6184b <redacted> + 46
6 QuartzCore 0x32a61819 <redacted> + 44
7 UIKit 0x32ddfe53 <redacted> + 86
8 CameraTest 0x000923b5 __35-[ViewController blockEnumeration:]_block_invoke + 184
9 CoreFoundation 0x305aa821 <redacted> + 92
10 libdispatch.dylib 0x3b3308eb <redacted> + 134
11 libdispatch.dylib 0x3b32fd71 <redacted> + 220
12 libdispatch.dylib 0x3b32ff59 <redacted> + 56
13 libsystem_pthread.dylib 0x3b46adbf _pthread_wqthread + 298
14 libsystem_pthread.dylib 0x3b46ac84 start_wqthread + 8
Фиксирование этих "незадействованных CATransactions", заставляя их запускать в основном потоке, исправляло проблемы с черной камерой.
Я смог исправить это, удалив опцию: NSEnumerationConcurrent из перечисления.
Пример приложения, которое может постоянно воспроизводить проблему, можно загрузить здесь
Надеемся, что пример приложения может дать некоторое понимание и работу вокруг проблемы.
Ответ 4
В ios7 вы должны установить mainWindow.rootViewController = класс имеет вид UIViewController. Это работает для меня.
Если rootViewController другой, например: UITabbarController, UINavigationController..., появится черный экран камеры.