我正在尝试在自定义视图中显示相机的内容。我只想实现自定义按钮拍照,以便一次拍摄多张照片。
理论上它应该开箱即用,但在实践中有时会发生如果我解除我的自定义视图控制器然后“快速”重新打开它,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
确实是我之前创建的用于放置选择器的视图。
通过自己挖掘一点问题,我注意到如果我在重新打开自定义视图控制器之前等待几秒钟,则选择器会正常显示。
通过查看控制台,看起来拾取器(或与之关联的相机资源)实际上在一段时间后才会释放,但这只是猜测。
有任何线索吗?感谢
答案 0 :(得分:1)
你肯定需要viewWillAppear调用,可能还需要更多。每当UIImagePickerController由一个“间接”表示方法(如模式表示或被推送到导航堆栈)呈现时,它会自动发送所有相应的显示相关通知:viewWillAppear:,viewDidAppear:,viewWillDisappear:和viewDidDisappear:
内部UIImagePickerController使用这些通知进行适当的初始化操作,如快门效果。你不知道它是如何使用它们的,你必须确保它能得到它们。
当您通过将UIImagePickerController的视图添加为子视图来直接呈现UIImagePickerController时,您将无法自动接收这些通知。来自View Controller Programming Guide:
如果您合并了一个视图 控制器对您的层次结构的看法 通过其他方式(通过添加它作为 也许是其他观点的子视图), 系统假定您要管理 你自己的观点,不发送 消息到相关视图 控制器对象。
这不一定是坏事,只是意味着你需要自己承担这些信息的责任。我没有看到你在显示选择器时遇到的这个确切问题,但我第一次尝试修复将是确保在适当的时间将这4个显示相关通知中的每一个发送到选择器控制器,尤其是消失的,如果你还没有这样做的话。