12

在此处输入图像描述我正在开发一个应用程序,它可以从 iDevice 的相机中捕获图像并将其上传到 Web 服务。

没问题,除了设备的相机外,一切正常。设备的相机让我发疯。我正在使用下面的代码来允许用户捕获图像。有时相机显示预览,有时不显示。而不是预览只是在屏幕上显示完全黑暗。如果我从后置摄像头切换到前置摄像头开始工作正常。我什至尝试从设备中删除所有后台应用程序并尽可能多地清除内存;仍然没有运气,我被困住了。:(

- (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];        
    }    
}
4

4 回答 4

7

我有一个客户遇到了这个问题。他们必须选择不允许访问相机。我们必须在“设置”中更改应用程序的相机隐私设置。当我们重新打开它时,不再有黑色的相机屏幕。

于 2015-02-13T22:06:10.140 回答
2

我在 iOS7 中遇到了同样的问题大约一个月,在对整个应用程序进行了长时间的代码审查之后,我能够确定问题所在。我正在枚举一个
IBOutletCollection(UILabel) NSArray *staticLabelsCollection; 数组同时更新标签文本,在多个线程上同时执行。

[self.labelsArr enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

    UILabel * label = (UILabel*)obj;

    label.text=[NSString stringWithFormat:@"%d",idx+2];

}];

这造成了在主线程之外更新 UIKit 元素的问题。我能够通过在 Xcode 中启用环境变量 CA_DEBUG_TRANSACTIONS=1 来解决这个问题,这会在设备控制台中生成警告

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”修复了黑色相机问题。我可以通过从枚举中删除 Option: NSEnumerationConcurrent 来修复它。

可以在此处下载可以不断重现问题的示例应用程序

希望示例应用程序可以提供一些见解和解决该问题的方法。

于 2013-11-21T07:32:50.930 回答
0

我在我的应用程序中遇到了这个问题。尽管我从未发现问题出在哪里,但我重写了代码以定义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:^{}];
  }
}

由于某种原因,这消除了预览有时会显示黑屏的问题

于 2013-05-26T06:13:29.763 回答
-1

在 ios7 中,你应该设置 mainWindow.rootViewController = 一个类有一种是 UIViewController。这对我有用。如果rootViewController是其他的,例如:UITabbarController, UINavigationController...,会出现相机黑屏。

于 2013-11-15T06:35:07.153 回答