iOS 6 supportedInterfaceOrientations问题

在我的视图控制器中,我实现了两种控制界面方向的方法:

- (NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskPortrait; } - (BOOL)shouldAutorotate { return YES; } 

supportedInterfaceOrientations方法中,我返回UIInterfaceOrientationMaskPortrait但是当时我意识到shouldAutorotate方法没有被调用。

但是我更改为在supportedInterfaceOrientations方法中return UIInterfaceOrientationPortrait 。 正在调用shouldAutorotate方法,但是在shouldAutorotate了一个错误:

UIApplicationInvalidInterfaceOrientation ,原因:“支持的方向与应用程序没有共同的方向,并且shouldAutorotate返回YES”

顺便说一下,我select支持的界面方向中的所有方向。

EDITED

我使用viewController和embeddednavigationController。 这里是AppDelegate.h

 @interface AppDelegate : UIResponder <UIApplicationDelegate,UINavigationControllerDelegate> @property (strong, nonatomic) UIWindow *window; @property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext; @property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel; @property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator; @property (readonly, strong, nonatomic) UINavigationController *navController; - (void)saveContext; - (NSURL *)applicationDocumentsDirectory; @end 

在AppDelegate.m下的didFinishLaunchingWithOptions方法中

  navController = (UINavigationController *)self.window.rootViewController; IPad_HomeViewController *rootVC=(IPad_HomeViewController *)navController.topViewController; rootVC.managedObjectContext = self.managedObjectContext; return YES; 

在我的IPad_HomeViewController中,

 @interface IPad_HomeViewController : UIViewController <UINavigationControllerDelegate> @property (strong, nonatomic) NSManagedObjectContext *managedObjectContext; @end 

 - (BOOL) shouldAutorotate { return YES; } // for landscape - (NSInteger) supportedInterfaceOrientations { return (1 << UIInterfaceOrientationLandscapeLeft) | (1 << UIInterfaceOrientationLandscapeRight); } 

如上所述,请查看特定方向的掩码值:UIInterfaceOrientationMask值。 UIInterfaceOrientationMask

两点:

  1. 你的错误信息是完全有道理的,因为使用UIInterfaceOrientationPortrait作为来自supportedInterfaceOrientations的返回值是没有意义的,它返回一个位掩码。 使用UIInterfaceOrientationMask值之一。

  2. 您似乎担心,如果您使用正确的UIInterfaceOrientationMaskPortrait ,那么iOS似乎不会调用shouldAutorotate 。 如果考虑到物理设备的物理方向以及应用程序当前的方向(即supportedInterfaceOrientations方向),则可能只需要调用shouldAutorotate 。 为什么它应该检查是否应该在设备已经处于可接受的状态?

有关更多信息,请参阅supportedInterfaceOrientations和Handling View旋转 。

我知道这听起来很基本,但是当我在iPhone上进行testing的时候,我正在绞尽脑汁找出方向问题 – 我在肖像模式下使用了物理自动locking模式 – 所以没有任何我改变的程序重要 – 认为这应该是故障排除步骤1 !

要更改方向设置,请select菜单“目标” – >“摘要” – >“支持的设备方向”,然后更改如下。

如果方向的button是黑暗的,那么这意味着你已经select了它作为一个方向。 在这里输入图像说明

而不是使用整数来声明方向,为什么不使用bool并在那里插入if语句来检测所需的方向。 这里是一个示例代码,我希望能帮助你:

 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { if (interfaceOrientation == UIInterfaceOrientationPortrait) { return YES; } if (interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) { return YES; } return NO; } 

你可以在if语句中添加所有的方向,它应该工作得很好。 阿德里安

编辑:

如果你想有一个iOS 6的选项,下面的代码应该适合你。

 - (BOOL) shouldAutorotate { return YES; } -(NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskLandscapeRight | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown; } 

你可以改变所有支持的方向与这个在iOS 6.愉快的编码

编辑1:

要以某种方式只旋转某些viewcontrollers ,只需使用我在上面发布的所有viewcontrollers的ios 6代码。 这里是步骤:

  1. 在所有四个国际internfaceorientations所在的项目层面, internfaceorientations所有的东西,关掉所有的东西,这样应用程序就会默认。

  2. 实现我在所有viewcontrollers提供的ios 6代码。

  3. 而不是在shouldautorotate方法中宣布。
  4. 在第二种方法中,插入任何你想要的方向。

这应该为你做的伎俩。 快乐的编码