强制横向应用程序调用supportedInterfaceOrientations(再次)

时间:2012-12-12 13:59:36

标签: xcode uinavigationcontroller ios6 rotation landscape

我目前在应用程序商店中有一个几乎只有风景的iPad应用程序,并且在处理旋转锁定时遇到了一些新的iOS 6方式问题。

这是一个基于UINavigationController的应用程序,因为iOS处理rootViewController的{​​{1}}的大部分责任,我必须手动询问每个UIViewController它想要的旋转。

由于我有非常大量的UIWindow s手动添加代码到每个控制器这样做会花费我很多年,所以我做了UINavigationController和UIViewController的扩展来覆盖这些调用,在那里我可以手动设置我想要阻止肖像的视图以及允许它的内容。

的UINavigationController-Extension.m:

UIViewController

我认为这已解决了问题(我还将应用程序锁定在info.plist中的横向,以便它将启动到lanscape,然后在应用程序委托中调用// // UINavigationController-Extension.m // DrivingInstructor // // Created by Liam Nichols on 06/12/2012. // Copyright (c) 2012 Liam Nichols. All rights reserved. // #import "UINavigationController-Extension.h" @implementation UINavigationController (Extension) -(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { return [self.topViewController shouldAutorotateToInterfaceOrientation:interfaceOrientation]; } -(NSUInteger)supportedInterfaceOrientations { return self.topViewController.supportedInterfaceOrientations; } -(BOOL)shouldAutorotate { return YES; } @end @implementation UIViewController (Extension) -(BOOL)shouldAutorotate { return NO; } -(NSUInteger)supportedInterfaceOrientations { if ([[self portraitClasses] containsObject:NSStringFromClass([self class])]) { return UIInterfaceOrientationMaskAll; } return UIInterfaceOrientationMaskLandscape; } -(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation { if ([[self portraitClasses] containsObject:NSStringFromClass([self class])]) { return YES; } return (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft || toInterfaceOrientation == UIInterfaceOrientationLandscapeRight); } -(NSArray*)portraitClasses { static NSArray *classes; if (classes == nil) { classes = @[ @"MockTestController", @"PLUILibraryViewController", @"PhotoViewController" ]; } return classes; } @end 并返回所有方向这样我的选择视图可以在需要时访问肖像。

所以这似乎有效,所有锁定到lanscape的视图控制器接受我在扩展类中指定的3 ..我正在监视扩展,每当我推到新控制器时它检查方向并锁定应用程序到指定的方向。

我找到的一个问题似乎无法解决的问题是,当我在我允许的视图控制器上进行纵向处理时,尝试弹回到上一个视图控制器锁定到横向的内容,{{1}永远不会再次调用,应该锁定到横向的视图不会(这会导致问题)。

根据apple文档,这是它应该如何工作,因为处理旋转的责任传递给rootViewController,并且由于用户没有旋转他们的设备并且rootViewController没有改变,所以不需要请求{{ 1}} ..

我的问题是,有没有办法让应用程序强制调用application:supportedInterfaceOrientationsForWindow:,还是应该以不同方式执行此操作?

感谢阅读,如果我能找到最后一个bug的解决方案,那么这段代码可能是对同样情况的人的一个很好的参考。

- - - - - - - - 编辑

正在进行一些进一步的调查,发现在supportedInterfaceOrientations函数之前,supportedInterfaceOrientations实际上实际上是在控制器上调用的,我试图弹回并确实返回正确的掩码{{1尝试让它自动从肖像中旋转回来,但它似乎没有听到这个响应,仍然留下supportedInterfaceOrientations的肖像......

所以这意味着我不需要再次调用viewWillAppear:,而是让设备旋转回到横向!

1 个答案:

答案 0 :(得分:0)

根据您可以致电的文件:

+ (void)attemptRotationToDeviceOrientation

如果我正确理解了文档,那么将再次向不同的视图控制器查询旋转。