UIImagePickerController 呈现在视图中

Posted

技术标签:

【中文标题】UIImagePickerController 呈现在视图中【英文标题】:UIImagePickerController presented inside view 【发布时间】:2010-04-30 19:11:17 【问题描述】:

是否可以在视图中显示 UIImagePickerController,而不是在模式或弹出框内使用它?

我试过了,没有成功...

if ([UIImagePickerController isSourceTypeAvailable:
     UIImagePickerControllerSourceTypePhotoLibrary]) 

    UIImagePickerController *picker = [[UIImagePickerController alloc] init];
    picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
    NSArray *mediaTypesAllowed = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypePhotoLibrary];
    [picker setMediaTypes:mediaTypesAllowed];
    picker.delegate = self;

    [picker.view setFrame:CGRectMake(0,0, 400, 400)]; // just for testing
    [picker.view setCenter:CGPointMake(200,200)];

    [myView addSubview:picker.view];
    [picker.view release];


感谢您的帮助

【问题讨论】:

必须有办法做到这一点。 Apple 在 Pages for the Media Picker 中执行此操作。他们有一个带有 UISegmentedControl 的弹出框,用于在弹出框上换入和换出页面。其中一个页面是 ImagePicker。 【参考方案1】:

可以合法吗?

是的。

您可以在弹出框/模态视图之外使用图像选择器,这本身并不违法,只是不受支持。因此它很脆弱。当你提交你的应用程序时,你不会遇到 Apple 的麻烦,但是每当新版本的 ios 出现时,你都需要特别注意,因为它有可能会崩溃(因为不支持在不同的方式)。

我就此联系了 Apple 的技术支持,因为我还需要使用分段控制实现类似于 iPad Pages.app 弹出框的功能。使用 Image Picker 作为分段控件视图内容之一。

我已完成所有设置并且工作正常,但我无法隐藏图像选择器中的“取消”按钮。苹果工程师告诉我这不是一个受支持的解决方案,还告诉我苹果“过去已知使用私有 API 来实现某些结果”。我不认为这是一个巨大的惊喜。但我敢肯定,至少今天他们确实限制了自己,至少对于他们在 App Store 中发布的应用程序只能使用公共 API。

解决方法

请在 BitBucket 上查看我的 git 存储库,我使用视图控制器包含(自 iOS 5 起可用)。

https://bitbucket.org/danielphillips/image-picker-demo

它还包括一些隐藏取消按钮的技巧。它确实使用了一个未记录的属性,但我不确定你是否可以称它为私有 API,我以前从未尝试过破解 Cocoa Touch 的私有 API,我也从未真正为此烦恼过,所以我不能说这是一个简单的 hack 还是 Apple 有软件可以检测到我使用了私有 API。

所以我不知道隐藏取消按钮部分是否会让你进入 App Store,但可能值得一试。

【讨论】:

【参考方案2】:

我强烈怀疑不超出 API 是否可行。

选择器视图的主要功能是安全地提供对系统范围资源的访问。换句话说,它具有 Apple 不希望任何应用程序能够覆盖的看门人功能。至少要强制限制对照片库的访问,它必须是模态的。

这可能会在 4.0 中放松,但我有点怀疑。

【讨论】:

弹出框本身实际上是模态的。您可以看到界面的其余部分,但弹出框会捕获所有触摸。在弹出框外点击会关闭它。 我不确定是否可以在任意视图中显示它(我也在寻找),但关于访问和 4.0 已经改变。在 4.0 中,您可以使用 Asset Library 类来枚举照片和视频并以编程方式访问它们。我相信这意味着您可以很容易地编写自己的图像浏览器。见:developer.apple.com/iphone/library/documentation./AssetsLibrary/… 我还没有摆弄资产库,但如果它允许任意访问媒体:(1)我会感到惊讶并且(2)很高兴。 Apple 对 iOS 表现出高度的隐私/安全问题/偏执狂。也许所有新的引擎盖下的安全内容都会让他们放松对开发人员的限制。【参考方案3】:

注意:“在弹出框外点击会关闭它”规则有一个小例外,这导致我的一个应用提交出现问题。如果您有工具栏,则点击工具栏(从技术上讲,它位于弹出框 = 之外)不会关闭弹出框。如果您不为这种情况编写代码,可能会同时生成两个弹出框,这会导致您的应用被拒绝...

【讨论】:

以上是关于UIImagePickerController 呈现在视图中的主要内容,如果未能解决你的问题,请参考以下文章

UIImagePickerController、自定义 UIButton 和 AutoLayout

UIImagePickerController 实况照片

OCMock 模拟 UIImagePickerController

UIImagePickerController 图像没有改变

无法弹出 UIImagePickerController

为啥 UIImagePickerController 不能推入导航栈?