41

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

使用 iOS 6 之前的 iOS,我的应用程序可以成功加载UIImagePickerControllervia的实例,presentViewController:animated:completion:即使它UIImagePickerController本身只支持纵向。

图像选择器只是向用户展示自己。用户旋转手机,选择他们的图像,然后旋转回横向。

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

但是,纵向操作对我的应用程序来说确实没有意义。我原以为我可以shouldAutorotateToInterfaceOrientation用来让应用程序“支持纵向”,但只能在这个视图中旋转到纵向。但现在该方法已被弃用,我不能使用与 shouldAutorotate 相同的技术。

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

4

5 回答 5

80

iOS 6.1 - 已修复

从 iOS 6.1 开始,这不再发生,遵循我的提示以避免在 iOS 6.0.x 下崩溃非常重要,以下仍然适用。


iOS 6.0.x 解决方法

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

Apple 的工程师在此处解释了此错误和解决方法:https ://devforums.apple.com/message/731764

发生这种情况是因为应用程序只需要横向,但一些 Cocoa 触摸视图控制器要求严格的纵向方向,这是错误的 - 不是他们应该需要更多的纵向,而是他们对应用程序要求的解释。

这方面的一个例子如下:

支持横向的 iPad 应用程序仅通过 UIPopoverController 显示 UIImagePickerController。UIImagePickerController 需要纵向,但应用程序仅强制横向。错误和...崩溃

其他被报告为有问题的框架包括 Game Center 登录视图控制器。

解决方法非常简单但并不理想......您保留在 info.plist/project 信息窗格中声明的正确方向,但在 Application Delegate 类中您声明您允许所有方向。

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


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

在此处输入图像描述

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


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

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

然后在我碰巧是的视图控制器中UINavigationController,我包含了一个包含以下内容的类别:

- (NSUInteger)supportedInterfaceOrientations{
    return UIInterfaceOrientationMaskLandscape;
}

现在我的应用程序没有旋转,图像选择器询问代理它是否可以显示为纵向,它被告知没关系。所以一切都很好。

于 2012-09-25T01:24:18.220 回答
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];

这为我解决了问题。你的情况有点不同,但听起来基本上是相同的错误。

于 2012-09-21T03:39:33.030 回答
26

虽然继承 UIImagePickerController 有效,但类别是更好的解决方案:

    @implementation UIImagePickerController (NonRotating)

    - (BOOL)shouldAutorotate
    {
        return NO;
    }

    -(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
    {
        return UIInterfaceOrientationPortrait;
    }

    @end
于 2012-09-24T18:12:12.540 回答
1

来自 iOS 7.1 的报告:

除了上述答案指定的内容之外,您似乎必须在 info.plist 中绝对启用纵向模式。

如果没有这个,上述代码/修复都没有对我有用。

于 2014-03-20T09:44:15.367 回答
1
-(NSUInteger)supportedInterfaceOrientations
{
   return UIInterfaceOrientationMaskLandscape;
}

将解决此问题,但来自 iOS7

于 2014-07-01T11:26:25.067 回答