在iOS7中处理一个视图控制器的自动旋转

我已经阅读了很多答案,但我似乎无法在iOS7上自动运行。

我只需要一个视图控制器来旋转,所以我不想在我的Info.plist中设置旋转设置。

据我了解苹果的文档,一个单一的视图控制器可以覆盖全局旋转设置(从Info.plist)只需重写两个方法。 Info.plist设置为只允许肖像,我的视图控制器实现以下方法:

- (NSUInteger)supportedInterfaceOrientations { NSLog(@"%s", __PRETTY_FUNCTION__); return UIInterfaceOrientationMaskAllButUpsideDown; } - (BOOL)shouldAutorotate { NSLog(@"%s", __PRETTY_FUNCTION__); return true; } 

我看到这些旋转的NSLog语句,但没有旋转。

如果我使用正确的旋转设置来configurationInfo.plist,我的视图将会旋转,但是如果我尝试依赖视图控制器,则不会。

不知道是否重要,但我试图旋转的视图是从使用自动布局的.xib。

另外,我的ViewController是模态呈现,并包含在一个导航控制器。 我试过只是提出视图控制器本身,这是行不通的。 我也尝试添加一个类别到UINavigationController从它的topViewController获取它的自动旋转方向。

您需要将plist值设置为所有可能的值,然后按照您认为合适的方式对其进行限制(在导航控制器和TabBar控制器中,从UIViewController类的说明:

在iOS 6及更高版本中,您的应用程序支持您的应用程序的Info.plist文件中定义的界面方向。 视图控制器可以覆盖supportedInterfaceOrientations方法来限制支持的方向列表。 通常,系统只在窗口的根视图控制器或呈现的视图控制器上调用此方法以填充整个屏幕; 子视图控制器使用父视图控制器为其提供的窗口部分,不再直接参与关于支持哪些旋转的决定。 应用程序的方向遮罩和视图控制器的方向遮罩的交集用于确定视图控制器可以旋转到哪个方向。

在我的情况下,我有一个新的iOS7应用程序,已经创build了约30个视图控制器。 我只需要一个模态视图控制器的自动旋转。 我不想更新预先存在的视图控制器。

我select了我在plist中想要的方向:

选择方向

然后,我在UIViewController上的应用程序委托中添加了一个类别:

 @implementation UIViewController (rotate) -(BOOL)shouldAutorotate { return NO; } @end 

然后在我想要旋转的单一模式视图控制器中,我添加了这个方法:

 -(BOOL)shouldAutorotate { return YES; } 

我还发现,如果我的视图控制器不是模态VC,我需要在UINavigationController上添加类别方法,而不是在根视图控制器之后的所有VC,作为视图控制器的导航堆栈的一部分 – 类似于这: https : //stackoverflow.com/a/20283331/396429

简单,但它工作得很好。 IOS 7.1和8

AppDelegate.h

 @property () BOOL restrictRotation; 

AppDelegate.m

 -(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window { if(self.restrictRotation) return UIInterfaceOrientationMaskPortrait; else return UIInterfaceOrientationMaskAll; } 

视图控制器

 -(void) restrictRotation:(BOOL) restriction { AppDelegate* appDelegate = (AppDelegate*)[UIApplication sharedApplication].delegate; appDelegate.restrictRotation = restriction; } 

viewDidLoad中

 [self restrictRotation:YES]; or NO 

我遇到过这样的问题 – 在我的应用程序中只有一个横向视图。 我用下面的代码来处理。

 #import "objc/message.h" -(void)viewWillAppear:(BOOL)animated{ objc_msgSend([UIDevice currentDevice], @selector(setOrientation:), UIInterfaceOrientationLandscapeLeft); } 

我知道这是旧的,但我最终在一个更独特的情况下,我们有50+ ViewController遍布整个应用程序,我拒绝通过修改和支持所有这些方向,但只有一个或2.这使我我的答案。 我创build了一个覆盖的UIViewController类别 – (BOOL)shouldAutorotate总是返回NO或YES取决于设备types等(这也可以通过支持的接口方向来完成)。 然后在ViewControllers,我想支持更多然后只是肖像,我swizzled shouldAutorotate返回YES。 然后在ViewController的viewWillAppear方法中使用下面的方法强制方向改变:

[[UIDevice currentDevice] setValue:@(UIInterfaceOrientationPortrait) forKey:@"orientation"].

当所有的事情都说完之后,我用less于30行代码的一些ViewController就使用一个macros来实现我想要的所有function。 如果我通过replace应用程序中的所有VC的shouldAutorotate和supportedInterfaceOrientations来完成,我将有250多行代码。 还有很多烦人的工作。