UIImagePickerController 显示黑色预览屏幕

Posted

技术标签:

【中文标题】UIImagePickerController 显示黑色预览屏幕【英文标题】:UIImagePickerController Showing Black Preview Screen 【发布时间】:2013-09-07 16:52:46 【问题描述】:

我在调用 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];
    

关于为什么会发生这种情况的任何想法?

谢谢

【问题讨论】:

你最后解决了吗?我在 ios 7 中遇到了同样的问题 我也对解决方案感兴趣。首先在 iOS7 中发生 - 黑色预览会在那里停留 30 秒,之后就可以正常工作了。 当您的应用程序内存不足时似乎确实会发生这种情况。但是,这并没有使它更容易解决。 嗨 很抱歉恢复旧帖子,但我也有这个问题,你没有发布答案。如果您找到解决方案,请发布。非常感谢! 【参考方案1】:

我刚刚解决了这个问题一天半,果然我在主线程之外做了一些与 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 中从未见过。

发布该文件的人建议您不要在项目中包含此文件的应用程序,我非常同意。

调试愉快!

【讨论】:

这对我有帮助!谢谢!在我的情况下,我正在从除 main 之外的线程中解散早期的 viewController。事件虽然这个失误发生在任何后续打开 UIImagePickerController 的努力之前,但将它放在主线程上解决了我的问题。 太棒了!您是使用上面的文件来查找问题,还是采用手动方法查看所有 UI Kit 调用?我发现文件方法非常方便。如果调试器对此抛出错误而不是产生这些疯狂的副作用,那就太好了。 我刚刚遇到了这个问题,与 *** 上的许多其他猜测相反,您的回答让我找到了正确的原因。谢谢。 纠正我,如果我错了。 Main Thread Checker in XCode11 should be able to do this now.【参考方案2】:

试试这个。它解决了我的问题,确保有一个值

(应用程序名称作为字符串)在您的 info.plist >“捆绑显示名称”中。

在我的情况下,它是空的,因此它不起作用。

如果 info.plist 中没有“Bundle display name”,则添加一个名为“Bundle display name”的行并粘贴您的应用名称。

【讨论】:

非常感谢!我应该如何怀疑这是黑色预览屏幕的原因? iOS 开发太诡异了! 我花了将近三个月的时间才弄清楚这个问题。很高兴听到它有帮助.. :)【参考方案3】:

在您的设备上进行测试。我认为您正在模拟器中对其进行测试,并且allowImageEditing 属性在iOS 3.1 中已弃用,所以不要使用它。

【讨论】:

当它显示黑色预览屏幕时,我实际上是在测试设备上的代码。另外,我没有使用allowImageEditing ..还有其他想法吗?谢谢你。【参考方案4】:

当主线程上的动画未在启动 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) 确实是找出具体罪魁祸首的最佳方法。

【讨论】:

【参考方案5】:

试试这个...

dispatch_async(dispatch_get_current_queue(), ^(void)
    imagePicker.sourceType =
    UIImagePickerControllerSourceTypeCamera;
    imagePicker.delegate = self;
    [self presentModalViewController:imagePicker animated:YES];
     ) ;

【讨论】:

【参考方案6】:

虽然这可能是一个取决于许多因素的问题,正如其他成员提供的成功解决方案所示,但我认为值得一提的是用户可能拒绝了相机使用权限(在隐私->相机- >您的应用程序),因此相机显示,但显示黑色预览屏幕。这只是发生在我身上,它取决于早期开发阶段的一个错误,在该错误中,由于重叠的警报,用户从未看到过该问题。

【讨论】:

【参考方案7】:

当您创建 UIImagePickerController 时,将 cameraOverlayView 更改为 nil。它对我来说就像一种魅力。

self.imagePickerController.cameraOverlayView = nil;

应该就是这样。

【讨论】:

出现错误:源类型必须是 UIImagePickerControllerSourceTypeCamera【参考方案8】:

请检查[UIApplication sharedApplication].keyWindow.frame

【讨论】:

以上是关于UIImagePickerController 显示黑色预览屏幕的主要内容,如果未能解决你的问题,请参考以下文章

UIImagePickerController、自定义 UIButton 和 AutoLayout

UIImagePickerController 实况照片

OCMock 模拟 UIImagePickerController

UIImagePickerController 图像没有改变

无法弹出 UIImagePickerController

为啥 UIImagePickerController 不能推入导航栈?