自定义视图中的 UIImagePickerController 不显示相机

Posted

技术标签:

【中文标题】自定义视图中的 UIImagePickerController 不显示相机【英文标题】:UIImagePickerController in custom view doesn't show camera 【发布时间】:2011-03-23 23:14:55 【问题描述】:

我正在尝试在自定义视图中显示相机的内容。我只是想实现的是有自定义按钮来拍照,以便一次拍摄多张照片。

理论上它应该开箱即用,但实际上有时会发生这样的情况,如果我关闭我的自定义视图控制器然后“快速”重新打开它,UIImagePickerController 只会显示空白(实际上是黑色)内容.有趣的是,如果您尝试拍照,相机实际上已启用并且快门打开并且您可以收集图像。唯一的问题似乎与将实时内容显示到特定的 UIView 中有关。

这是我用来显示它的代码:

UIImagePickerController *imagePickerController = [[UIImagePickerController alloc] init];

[imagePickerController setSourceType:UIImagePickerControllerSourceTypeCamera];
[imagePickerController setShowsCameraControls:NO];
[imagePickerController setEditing:NO];
[imagePickerController setNavigationBarHidden:YES];

[imagePickerView addSubview:[imagePickerController view]];
[imagePickerController viewWillAppear:YES];

我不喜欢 viewWillAppear 方法调用,但这是我找到的唯一展示方式。 imagePickerView 确实是我之前创建的用于放置选取器的视图。

通过自己挖掘一点问题,我注意到如果我在重新打开自定义视图控制器之前等待几秒钟,选择器会正常显示。

通过查看控制台,似乎选择器(或与之关联的相机资源)实际上在一段时间后被释放,但这只是一个猜测。

有什么线索吗?谢谢

【问题讨论】:

【参考方案1】:

您肯定需要 viewWillAppear 调用,而且可能更多。每当 UIImagePickerController 由一种“间接”表示方法(如模态表示,或被推送到导航堆栈)呈现时,它会自动发送所有适当的显示相关通知:viewWillAppear:、viewDidAppear:、viewWillDisappear: 和viewDidDisappear:。

UIImagePickerController 在内部使用这些通知来执行适当的初始化操作,例如快门效果。你不知道它是如何使用它们的,你只需要确保它得到它们。

当您通过将其视图添加为子视图来直接呈现 UIImagePickerController 时,您将剥夺它自动接收这些通知的能力。来自View Controller Programming Guide:

如果你合并一个视图 控制器对您的层次结构的看法 通过其他方式(通过将其添加为 子视图可能是其他视图), 系统假设您要管理 自己查看,不发送 到相关视图的消息 控制器对象。

这不一定是坏事,它只是意味着您需要自己承担这些消息的责任。我还没有看到您在显示选择器时遇到的这个确切问题,但我第一次尝试修复是确保在适当的时间将这 4 个与显示相关的通知中的每一个都发送到选择器控制器,尤其是消失的那些,如果你还没有这样做的话。

【讨论】:

你是对的。我按照你的建议做了完全一样的事情,现在它就像一个魅力。谢谢! HI F***o,请分享您在 addSubview 之后处理了哪些其他与视图相关的通知。我遇到了类似的问题并在控制台上收到警告 - “忽略拍照请求;相机尚未准备好。”

以上是关于自定义视图中的 UIImagePickerController 不显示相机的主要内容,如果未能解决你的问题,请参考以下文章

Django 中的自定义与通用视图

onDraw 滚动视图中的自定义视图

自定义滚动谷歌颤动中的水平列表视图

更改 uitableviewcell 中的自定义附件视图?

样式视图传递给 SwiftUI 中的自定义视图

自定义视图中的 UIImagePickerController 不显示相机