我的应用程序仅通过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)人是否可以将其显示为人像,并告知它可以。因此,一切都进行得很好。