支持的方向与应用程序没有共同的方向,而且应该是返回YES'
我的应用程序(iPad; iOS 6)是一个风景只有应用程序,但是当我尝试使用UIPopoverController来显示照片库时,会引发此错误: Supported orientations has no common orientation with the application, and shouldAutorotate is returning YES.
我试过改变很多代码,但我没有运气。
在IOS6中,您在三个位置支持接口方向:
- .plist(或目标摘要屏幕)
- 你的UIApplicationDelegate
- 正在显示的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)