Подтвердить что ты не робот

Камера iDevice показывает черный вместо предварительного просмотра

enter image description here Я разрабатываю приложение, которое захватывает изображения с камеры 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];        
    }    
}
4b9b3361

Ответ 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..., появится черный экран камеры.