iOS 10 UIImagePickerController黑屏问题

3
我面临一个奇怪的问题...
在运行iOS 10的设备上,相机预览显示黑屏。
但在旧版本中它可以正常工作
我正在使用UIImagePickerController
self.sourceType = UIImagePickerControllerSourceTypeCamera;

我的 info.plist 文件:

enter image description here

enter image description here

示例项目:https://github.com/arturdev/cameraTest


7个回答

3
我用了不同的方法来解决这个问题。
不要创建UIImagePickerController的子类,因为苹果不支持UIImagePickerController的子类。
重要提示:

UIImagePickerController类仅支持竖屏模式。此类旨在以现有形式使用,不支持子类化。该类的视图层次结构是私有的,不能修改,但有一个例外。您可以将自定义视图分配给cameraOverlayView属性,并使用该视图呈现其他信息或管理相机接口与代码之间的交互。

下面是另一种解决方案:
在UIViewController中添加以下代码:
self.imagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera;
self.imagePickerController.showsCameraControls = NO;
self.imagePickerController.delegate = self;

[self.view addSubview:self.imagePickerController.view];
[self addChildViewController:self.imagePickerController];
[self.imagePickerController didMoveToParentViewController:self];
在所有iOS版本和设备上都能正常工作。:):)

2

请使用UIImagePickerController()代替其他任何初始化方法。

我遇到了同样的问题,原因是调用了错误的初始化方法。


0
如果您使用Xcode 8,则需要在info.plist中添加相机的隐私设置才能访问相机。

@arturdev 兄弟,你有没有找到解决这个问题的方法或原因或替代方案? - Ankit Gupta
@AnkitGupta 没有 :( - arturdev

0
你是不是在使用UIActionSheet来展示UIImagePickerController?我通过将UIActionSheet替换为UIAlertController来解决了这个问题。因为UIAlertView可能会导致未知的错误,请不要再使用UIAlertView;)

0
可能的原因如下,请尝试检查是否有帮助:
------ 尝试在主线程中显示UIImagePickerController相关代码:
dispatch_async(dispatch_get_current_queue(), ^(void){

    //Code related to show UIImagePickerController

    .....

    self.imagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera;
    self.imagePickerController.showsCameraControls = NO;
    self.imagePickerController.delegate = self;

    [self.view addSubview:self.imagePickerController.view];
    [self addChildViewController:self.imagePickerController];
    [self.imagePickerController didMoveToParentViewController:self];

    .....

});

----- 检查 info.plist >Bundle display name:

如果 info.plist >Bundle display name 为空,则添加 Bundle display name 键和值 your application name

------ 将相机隐私设置为info.plist以访问相机:

相机:

键 :Privacy - Camera Usage Description
值 :$(PRODUCT_NAME) camera use

------ 不要子类化 UIImagePickerController (如 Ankit Gupta 的答案建议)

UIImagePickerController类仅支持纵向模式。此类旨在按原样使用,不支持子类化。

将自定义视图分配给cameraOverlayView属性,并使用该视图呈现其他信息或管理相机界面与代码之间的交互。

Reference:https://developer.apple.com/reference/uikit/uiimagepickercontroller


-viewDidLoad方法已经在主线程中执行,所以不需要再次在主线程中调度。我的info.plist已经修改过了,但是还是不起作用。 - arturdev
@arturdev 我也遇到了同样的问题。你找到解决方法了吗?如果你解决了,请告诉我。 - Ankit Gupta
很遗憾,@AnkitGupta没有。 - arturdev
也收到了这个警告 [MC] systemgroup.com.apple.configurationprofiles 的系统组容器路径为 /private/var/containers/Shared/SystemGroup/systemgroup.com.apple.configurationprofiles这是否与问题有关? - Ankit Gupta
@arturdev - 你找到解决方案了吗?对我来说,iPad 的横屏模式下只会出现空白屏幕。 - nOOb iOS
@arturdev - 你的意思是将它作为子视图添加并移动到父视图,而不是presentViewController吗?但我把它放在了tableViewCell中。 - nOOb iOS

0

也许你忘记了呈现UIImagePickerController,这就是为什么你得到空白屏幕的原因 :-

[self presentViewController:yourImagePickerController animated:YES completion:NULL];

1
那么粗体中的“旧版本工作正常”是什么意思? - Ronak Chaniyara
这就是为什么我说“可能”。@RonakChaniyara - tryKuldeepTanwar

-2

我曾经遇到过同样的问题。iOS10有些奇怪。所以我想出了解决方案。即使您正在使用UIImagePickerController或将其与您的视图控制器扩展,只需在viewDidLoad中创建一个UIImagePickerController实例并呈现它即可。

UIImagePickerController *imagePickerController = [UIImagePickerController alloc];

[self presentViewController:imagePickerController animated:YES completion:nil];


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接