调用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];
}
有关为何发生这种情况的任何想法?
谢谢
答案 0 :(得分:4)
我刚刚解决了这个问题一天半,我确实在主线程之外做了一些UI相关的事情。就我而言,我正在更新异步Web服务调用的响应处理代码中的标签。
在一个有多个视图控制器的应用程序中,每个视图控制器都有2000多行代码,这类事情很难追查。这最终让我得到了答案,而且非常快。
https://gist.github.com/steipete/5664345
这家伙发布了一个可以下载并添加到项目中的课程。只需将其添加到您的项目中,您无需在任何地方使用它或尝试在任何地方实例化,只需将其添加到您的项目中即可。他还说你应该在没有ARC的情况下运行它。为此,请转到Build Phases选项卡,展开Compile Sources,双击该文件,然后键入-fno-objc-arc
现在,运行您的项目并导航到您遇到黑色图像预览屏幕的位置。如果一切都按计划进行,那么在此之前的某个时刻,您的应用程序应该崩溃并转储到控制台,以获取有关在主线程外执行UIKit操作的一些信息。根据您的应用程序正在执行的操作以及转储到控制台的内容,您应该能够非常快速地找到导致问题的代码行。在我的情况下,我能够使用
调用我的响应处理程序[self performSelectorOnMainThread:@selector(handleResponse:) withObject:data waitUntilDone:true];
我的问题立即消失了
此外,这个问题只在我更新到iOS 7后才开始,我从未在iOS 5或iOS 6中看到过这个问题。
发布该文件的人建议您不要使用项目中包含的此文件发送您的应用程序,我非常同意。
快乐的调试!
答案 1 :(得分:4)
试试这个。它解决了我的问题,确保有值
您的info.plist
>中的(应用名称为字符串) " 捆绑显示名称"。
就我而言,它是空的,因此它没有用。
如果" 捆绑显示名称"在info.plist中没有,然后添加一行名为" Bundle display name"并粘贴您的appname。
答案 2 :(得分:0)
在您的设备中测试此内容。我认为你是在模拟器和allowImageEditing属性中测试它在iOS 3.1中不推荐使用所以不要使用它。
答案 3 :(得分:0)
如果在主线程上没有启动动画并行启动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
)确实是找出具体罪魁祸首的最佳方法。
答案 4 :(得分:0)
试试这个......
dispatch_async(dispatch_get_current_queue(), ^(void){
imagePicker.sourceType =
UIImagePickerControllerSourceTypeCamera;
imagePicker.delegate = self;
[self presentModalViewController:imagePicker animated:YES];
} ) ;
答案 5 :(得分:0)
虽然这可能是一个取决于许多因素的问题,如其他成员提供的成功解决方案所示,我认为值得一提的是用户可能已拒绝使用相机的权限(隐私权下) - &gt;相机 - &gt;您的应用程序),因此相机显示,但显示黑色预览屏幕。它恰好发生在我身上,它依赖于早期开发阶段的一个错误,因为警报重叠,用户从未看到过这个问题。
答案 6 :(得分:0)
当您创建UIImagePickerController时,将cameraOverlayView更改为nil。它对我来说就像一个魅力。
self.imagePickerController.cameraOverlayView = nil;
那应该是它。
答案 7 :(得分:-1)
请检查[UIApplication sharedApplication] .keyWindow.frame