在iOS 6.0下展示UIImagePickerController时崩溃

时间:2012-09-20 23:43:10

标签: orientation landscape ios6

我的应用仅通过supportedInterfaceOrientation属性支持横向定位。

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

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

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

然而,纵向操作对我的应用来说真的没有意义。我以为我可以使用shouldAutorotateToInterfaceOrientation来允许应用“支持肖像”,但只允许在这一个视图中旋转到肖像。但是现在该方法已被弃用,我不能在shouldAutorotate中使用相同的技术。

有没有人有任何想法如何解决iOS 6.0下的这个问题?

5 个答案:

答案 0 :(得分: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 Touch视图控制器需要严格的纵向方向,这是错误 - 不是它们应该需要更多的肖像,而是它们对应用程序要求的解释。

这方面的一个例子如下:

  

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

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

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

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


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

enter image description here

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


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

- (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