我正在开发一个应用程序,可以从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];
}
}
答案 0 :(得分:7)
我有一位客户遇到过这个问题。他们必须选择不允许访问相机。我们必须在“设置”中更改应用程序的相机隐私设置。当我们重新打开时,不再有黑色相机屏幕。
答案 1 :(得分:2)
我在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元素的问题。 我能够通过在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&#39;通过强制它们在主线程上运行固定黑色相机问题。 我能够通过从枚举中删除Option:NSEnumerationConcurrent来修复它。
可以下载可以不断重现问题的示例应用here
希望示例应用可以为问题提供一些见解和解决方法。
答案 2 :(得分: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:^{}];
}
}
出于某种原因,这解决了预览有时显示黑屏的问题
答案 3 :(得分:-1)
在ios7中,你应该设置mainWindow.rootViewController =一个类的类是UIViewController。这对我有用。 如果rootViewController是其他的,例如:UITabbarController,UINavigationController ...,将出现相机的黑屏。