支持的方向与应用程序没有共同的方向,而且应该是返回YES'

我的应用程序(iPad; iOS 6)是一个风景只有应用程序,但是当我尝试使用UIPopoverController来显示照片库时,会引发此错误: Supported orientations has no common orientation with the application, and shouldAutorotate is returning YES. 我试过改变很多代码,但我没有运气。

在IOS6中,您在三个位置支持接口方向:

  1. .plist(或目标摘要屏幕)
  2. 你的UIApplicationDelegate
  3. 正在显示的UIViewController

如果您遇到此错误,很可能是因为您在UIPopover中加载的视图仅支持纵向模式。 这可能是由Game Center,iAd或您自己的看法造成的。

如果是你自己的看法,你可以通过在你的UIViewController上覆盖supportedInterfaceOrientation来解决它:

 - (NSUInteger) supportedInterfaceOrientations { //Because your app is only landscape, your view controller for the view in your // popover needs to support only landscape return UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight; } 

如果不是您自己的看法(例如iPhone上的GameCenter),您需要确保您的.plist支持纵向模式。 您还需要确保您的UIApplicationDelegate支持以纵向模式显示的视图。 你可以通过编辑你的.plist,然后覆盖你的UIApplicationDelegate上的supportedInterfaceOrientation来完成:

 - (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window { return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight; } 

花了很多时间寻找避免子类化和添加大量代码的方法之后,这里是我的一行代码解决scheme。

创build一个新的UIImagePickerController的类别并添加

 -(BOOL)shouldAutorotate{ return NO; } 

这就是所有人!

还有另一种情况可能会出现此错误消息。 我正在寻找几个小时,直到我发现问题。 这个线程读了几次后非常有帮助。

如果您的主视图控制器旋转到横向,并调用一个自定义的子视图控制器,应该以纵向显示,当您的代码如下所示时,可能会发生此错误消息:

 - (NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationPortrait; } 

这里的陷阱是Xcode的intellisensebuild议“UIInterfaceOrientationPortrait”,我不关心它。 乍一看这似乎是正确的。

正确的掩码被命名

 UIInterfaceOrientationMaskPortrait 

注意小中缀“面具” ,否则你的子视图将以exception和上面提到的错误消息结束。

新的枚举有点偏移。 旧的枚举返回无效的值!

(在UIApplication.h中,您可以看到新的声明: UIInterfaceOrientationMaskPortrait =(1 << UIInterfaceOrientationPortrait)

解决scheme是:

 - (BOOL)shouldAutorotate { return YES; } - (NSUInteger)supportedInterfaceOrientations { // ATTENTION! Only return orientation MASK values // return UIInterfaceOrientationPortrait; return UIInterfaceOrientationMaskPortrait; } 

迅速使用

 override func shouldAutorotate() -> Bool { return true } override func supportedInterfaceOrientations() -> Int { return Int(UIInterfaceOrientationMask.Portrait.rawValue) } 

当在一个横向的应用程序中呈现图像select器时,我遇到了类似的问题。 正如Luiji博士所build议的那样,我在控制器开始的时候添加了以下类别。

 // This category (ie class extension) is a workaround to get the // Image PickerController to appear in landscape mode. @interface UIImagePickerController(Nonrotating) - (BOOL)shouldAutorotate; @end @implementation UIImagePickerController(Nonrotating) - (BOOL)shouldAutorotate { return NO; } @end 

在您的ViewController .m文件的@implementation之前添加这些行是最简单的。

我在我的代码中遇到了同样的错误信息。 我发现这是苹果公司报告的错误:

https://devforums.apple.com/message/731764#731764

他的解决scheme是解决它在AppDelegate。 我实现了它,它适用于我!

我有同样的问题,这个答案https://stackoverflow.com/a/12523916适合我。; 不知道是否有更优雅的解决scheme。

我的代码:

 UIImagePickerController *imagePickerController = [[NonRotatingUIImagePickerController alloc] init]; imagePickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; UIPopoverController *popoverVC = [[UIPopoverController alloc] initWithContentViewController:imagePickerController]; [popoverVC presentPopoverFromRect:frame // did you forget to call this method? inView:view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; 

iOS 8 – 您可以使用UIModalPresentationPopover,而不需要任何黑客来显示在popup窗口中。 不理想,但比没有好。

 imagePicker.modalPresentationStyle = UIModalPresentationPopover; imagePicker.popoverPresentationController.sourceView = self.view; imagePicker.popoverPresentationController.sourceRect = ((UIButton *)sender).frame; 

编辑:也许尝试不同的UIModalPresentationStyles – 也许更多将在景观工作。

 - (BOOL)shouldAutorotate { return NO; } -(NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskPortrait; } This removes the crash. 

解决我的问题的另一个选项是创buildUIImagePickerController的子类,并覆盖下面的方法

 @interface MyImagePickerController () @end @implementation MyImagePickerController - (NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskLandscape; } 

使用这个而不是UIImagePickerController,它一切正常。

创build一个类别对于修复这个bug非常有用。 不要忘记导入您创build的类别。 这会将缺less的方法添加到UIImagePickerController,在iOS 6上,它将限制它在Portrait中工作,因为文档状态顺便说一句。

其他解决scheme可能已经工作。 但是,对于编译为在iOS 6.1上部署的用于iOS 8.x的SDK,这似乎是要走的路。

.h文件:

 #import <UIKit/UIKit.h> @interface UIImagePickerController (iOS6FIX) - (BOOL) shouldAutorotate; - (UIInterfaceOrientation) preferredInterfaceOrientationForPresentation; @end 

.m文件:

 #import "UIImagePickerController+iOS6FIX.h" @implementation UIImagePickerController (iOS6FIX) - (BOOL) shouldAutorotate { return NO; } - (UIInterfaceOrientation) preferredInterfaceOrientationForPresentation { return UIInterfaceOrientationPortrait; } @end 

Swift 3

 let imagePicker = UIImagePickerController() imagePicker.modalPresentationStyle = .popover imagePicker.popoverPresentationController?.sourceView = sender // you can also pass any view present(imagePicker, animated: true)