我的应用程序仅通过supportedInterfaceOrientation属性支持横向方向。

使用iOS 6之前的iOS,即使UIImagePickerController本身仅支持纵向,我的应用也可以通过presentViewController:animated:completion:成功加载UIImagePickerController实例。

图像选择器只是简单地将其自身呈现给用户。用户旋转电话,拾取图像,然后旋转回横向。

在iOS 6.0下,使用presentViewController:animated:completion:实例调用UIImagePickerController会使应用程序崩溃。我可以通过在supportedInterfaceOrientation属性中添加纵向选项来防止崩溃。

但是,对我的应用而言,纵向操作确实没有任何意义。我以为可以使用shouldAutorotateToInterfaceOrientation允许应用“支持人像”,但只能在此 View 中旋转为人像。但是现在不赞成使用该方法,并且我不能对shouldAutorotate使用相同的技术。

有谁知道如何在iOS 6.0下解决此问题?

最佳答案

iOS 6.1-固定

从iOS 6.1开始,不再出现,按照我的提示进行操作非常重要,以避免在iOS 6.0.x下崩溃,以下内容仍然适用。

iOS 6.0.x解决方法

实际上,这实际上是iOS 6.0中的错误,应该在将来的iOS版本中修复。

苹果公司的工程师在此解释了此错误以及解决方法:https://devforums.apple.com/message/731764

之所以发生这种情况,是因为应用程序仅需要横向放置,而某些Cocoa Touch View Controller却严格要求纵向放置,这是错误的-不是他们应该比纵向放置更多的需求,而是他们对应用程序需求的解释。

下面是一个示例:



被报告为有问题的其他框架包括Game Center登录 View Controller 。

解决方法很简单,但并不理想...您可以在info.plist / project信息 Pane 中声明正确的方向,但是在Application Delegate类中声明可以允许所有方向。

现在,您添加到窗口中的每个View Controller必须自行指定只能是Landscape。请检查链接以获取更多详细信息。

我不能强调您不应该将UIImagePickerController子类化多少,因为公认的解决方案要求您这样做。

这里重要的是“此类旨在按原样使用,不支持子类。”

在我的情况下,我将此添加到了我的应用程序的委托(delegate)中(我有一个只有风景的应用程序),这告诉它可以显示的图像选择器,因为支持纵向:

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{
    return UIInterfaceOrientationMaskAll;
}

然后在我的 View Controller 中碰巧是UINavigationController,我加入了一个类别,内容如下:
- (NSUInteger)supportedInterfaceOrientations{
    return UIInterfaceOrientationMaskLandscape;
}

现在我的应用程序不旋转,图像选择器询问委托(delegate)人是否可以将其显示为人像,并告知它可以。因此,一切都进行得很好。

10-07 19:13
查看更多