我的应用仅通过supportedInterfaceOrientation
属性支持横向定位。
使用iOS 6之前的iOS,我的应用可以通过UIImagePickerController
成功加载presentViewController:animated:completion:
的实例,即使UIImagePickerController
本身仅支持纵向方向。
图像选择器只是向用户侧面展示自己。用户旋转手机,拾取他们的图像,然后旋转回横向。
在iOS 6.0下,使用presentViewController:animated:completion:
实例调用UIImagePickerController
会导致应用崩溃。我可以通过向我的supportedInterfaceOrientation
属性添加纵向选项来防止崩溃。
然而,纵向操作对我的应用来说真的没有意义。我以为我可以使用shouldAutorotateToInterfaceOrientation
来允许应用“支持肖像”,但只允许在这一个视图中旋转到肖像。但是现在该方法已被弃用,我不能在shouldAutorotate中使用相同的技术。
有没有人有任何想法如何解决iOS 6.0下的这个问题?
答案 0 :(得分:80)
从iOS 6.1开始,这不再发生,为了避免iOS 6.0.x下的崩溃,遵循我的提示非常重要,以下内容仍适用于此。
实际上这是iOS 6.0中的一个错误,这应该在未来的iOS版本中修复。
Apple的一位工程师在这里解释了这个错误和解决方法:https://devforums.apple.com/message/731764
这种情况正在发生,因为应用程序只需要横向方向,但是一些Cocoa Touch视图控制器需要严格的纵向方向,这是错误 - 不是它们应该需要更多的肖像,而是它们对应用程序要求的解释。
这方面的一个例子如下:
支持横向的iPad应用程序仅显示UIImagePickerController 通过UIPopoverController。 UIImagePickerController需要 纵向方向,但应用程序仅强制横向。错误 和...崩溃
其他报告为有问题的框架包括Game Center登录视图控制器。
解决方法非常简单,但并不理想......您保持在info.plist /项目信息窗格中声明的正确方向,但在Application Delegate类中,您声明允许所有方向。
现在,您添加到窗口的每个View Controller必须指定它只能是Landscape。请查看链接以获取更多详细信息。
我不能强调你不应该将UIImagePickerController
子类化为多少,因为已接受的解决方案坚持要你这样做。
这里重要的是“此类旨在按原样使用,不支持子类化。”
在我的情况下,我将此添加到我的应用程序的委托(我有一个仅限横向的应用程序),这告诉它可以显示的图像选择器,因为支持肖像:
- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{
return UIInterfaceOrientationMaskAll;
}
然后在我的视图控制器中碰巧是UINavigationController
,我包含了以下类别:
- (NSUInteger)supportedInterfaceOrientations{
return UIInterfaceOrientationMaskLandscape;
}
现在我的应用程序没有旋转,图像选择器询问代表是否可以显示为肖像并且它被告知没关系。所以一切都很好。
答案 1 :(得分:41)
我有一个类似的问题,但在iPad横向应用程序中。我在弹出窗口中呈现图像选择器。它在iOS 6下崩溃。错误表明选择器需要肖像,但应用程序只提供横向视图,而且......重要的是...选择器的shouldRotate返回YES。
我将此添加到我正在创建选择器的ViewControllerClass.m
@interface NonRotatingUIImagePickerController : UIImagePickerController
@end
@implementation NonRotatingUIImagePickerController
- (BOOL)shouldAutorotate
{
return NO;
}
@end
然后使用该类
UIImagePickerController *imagePicker = [[NonRotatingUIImagePickerController alloc] init];
[myPopoverController setContentViewController:imagePicker animated:YES];
这解决了我的问题。你的情况有点不同,但听起来基本上是同样的错误。
答案 2 :(得分:26)
虽然子类化UIImagePickerController有效,但类别是更好的解决方案:
@implementation UIImagePickerController (NonRotating)
- (BOOL)shouldAutorotate
{
return NO;
}
-(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
return UIInterfaceOrientationPortrait;
}
@end
答案 3 :(得分:1)
从iOS 7.1报告:
除了上面的答案所指出的,似乎你必须在info.plist中绝对启用肖像模式。
如果没有这些,上述代码/修复程序都不适用于我。
答案 4 :(得分:1)
-(NSUInteger)supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskLandscape;
}
将解决问题但是来自iOs7