10

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

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

谢谢

4

8 回答 8

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 中从未见过。

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

调试愉快!

于 2014-02-11T19:12:29.827 回答
4

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

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

就我而言,它是空的,因此它不起作用。

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

于 2015-12-30T11:06:26.863 回答
0

尝试这个...

dispatch_async(dispatch_get_current_queue(), ^(void){
    imagePicker.sourceType =
    UIImagePickerControllerSourceTypeCamera;
    imagePicker.delegate = self;
    [self presentModalViewController:imagePicker animated:YES];
    } ) ;
于 2014-04-11T04:46:32.263 回答
0

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

于 2013-09-08T02:40:45.543 回答
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)确实是找出具体罪魁祸首的最好方法。

于 2013-09-17T22:29:49.350 回答
0

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

self.imagePickerController.cameraOverlayView = nil;

应该就是这样。

于 2017-03-23T20:07:36.603 回答
0

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

于 2017-02-07T08:08:38.243 回答
-1

请检查 [UIApplication sharedApplication].keyWindow.frame

于 2016-11-18T09:46:19.980 回答