在iOS 6.0下呈现UIImagePickerController时发生崩溃

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

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

图像select器简单地将其自身呈现给用户。 用户旋转手机,select他们的形象,然后旋转回风景。

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

然而,纵向操作真的没有任何意义,我的应用程序。 我以为我可以使用shouldAutorotateToInterfaceOrientation允许应用程序“支持肖像”,但只允许旋转到肖像在这一个视图。 但是现在这个方法已经被废弃了,我不能使用与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触摸视图控制器严格要求纵向方向,这是错误 – 不是他们应该要求更多纵向,而是他们对应用程序要求的解释。

这方面的一个例子可以是:

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

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

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

现在,您添加到窗口中的每个视图控制器必须指定它自己只能是横向。 请检查链接了解更多详情。


我不能强调你不应该UIImagePickerController因为接受的解决scheme是坚持你做的。

在这里输入图像说明

这里重要的是“ 这个类是为了原样使用,不支持子类”


在我的情况下,我把它添加到我的应用程序的委托(我有一个风景只有应用程序),这告诉图像select器它可以显示,因为肖像是支持的:

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

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

 - (NSUInteger)supportedInterfaceOrientations{ return UIInterfaceOrientationMaskLandscape; } 

现在我的应用程序不旋转,图像select器询问委托人是否可以显示为肖像,它被告知没关系。 所以一切都很好。

我有一个类似的问题,但在iPad景观应用程序。 我在展示图像select器。 它在iOS 6下崩溃。这个错误提示select器需要肖像,但是应用程序只提供横向视图,而且…重要的是…select器的shouldRotate返回YES。

我添加到我的ViewControllerClass.m创buildselect器

 @interface NonRotatingUIImagePickerController : UIImagePickerController @end @implementation NonRotatingUIImagePickerController - (BOOL)shouldAutorotate { return NO; } @end 

然后用这个类代替

 UIImagePickerController *imagePicker = [[NonRotatingUIImagePickerController alloc] init]; [myPopoverController setContentViewController:imagePicker animated:YES]; 

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

虽然子类UIImagePickerController的作品,类别是一个更好的解决scheme:

  @implementation UIImagePickerController (NonRotating) - (BOOL)shouldAutorotate { return NO; } -(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation { return UIInterfaceOrientationPortrait; } @end 

从iOS 7.1报告:

除了上面的答案指定之外,您似乎必须在info.plist中完全启用纵向模式。

没有这些上述代码/修复没有为我工作。

 -(NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskLandscape; } 

将解决这个问题,但从iOs7