即使被告知不要,iOS6方向仍在旋转

我似乎有我的iOS应用程序的困难。

它的部署目标是iOS5.0,但是我正在使用iOS 6.0 SDK。

在我的视图控制器中,我有:

-(NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskPortrait; } - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation { return UIInterfaceOrientationMaskPortrait; } -(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation { return (toInterfaceOrientation == UIInterfaceOrientationPortrait); } 

这在iOS5模拟器中运行时工作正常。 该视图不会旋转到LandScape或颠倒。

但是,在IOS6模拟器(和设备上),它将继续旋转。

我已经使用NSLog来检查-supportedInterfaceOrientations是否被调用,它有两次,但它仍然旋转到LandScape(右或左)

我究竟做错了什么?

我还扩展了UINavigationController (我的根视图控制器)来包含这个:

 @implementation UINavigationController (Rotation_IOS6) -(BOOL)shouldAutorotate { return [[self.viewControllers lastObject] shouldAutorotate]; } -(NSUInteger)supportedInterfaceOrientations { return [[self.viewControllers lastObject] supportedInterfaceOrientations]; } - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation { return [[self.viewControllers lastObject] preferredInterfaceOrientationForPresentation]; } @end 

但仍然没有成功。

谢谢。

编辑

按照马特的回答。 我也需要扩展UITabBarController类似的实现我的UINavigationController和工作。

希望这可以帮助别人。

问题可能是你有一个导航界面。 你做? 如果是这样,您需要inheritanceUINavigationController并使用该子类的实例作为导航控制器。 在那个子类中, 是实现supportedInterfaceOrientations 。 对于任何父视图控制器也是如此(例如UITabBarController)。

原因在于iOS 6的旋转思维方式与iOS 5 完全不同。你认为从iOS 5知道的东西没有什么用处。 在iOS 6中,我们从应用程序本身的层面开始,通过应用程序代理的方式向根视图控制器或其他全屏视图控制器(例如一个呈现的视图控制器) 停止工作 。 父母不再咨询子女。

此外,应用程序本身(通过info.plist或应用程序委托)必须列出应用程序的任何部分都可以假定的每个方向; 视图控制器只能要求这些的一个子集

请参阅发行说明:

http://developer.apple.com/library/ios/#releasenotes/General/RN-iOSSDK-6_0/_index.html

但是请注意,这句话是谎言:

为了兼容性,仍然实现shouldAutorotateToInterfaceOrientation:方法的视图控制器不会获得新的自动旋转行为

相反,在iOS 6中,较老的自动旋转方法被完全忽略; 每个人都获得新的自转行为。 它不是“选入”。

如果你不想让应用程序旋转,你可以从你的info.plist中支持的界面方向中删除横向,应该这样做。

否则,你需要告诉你的根视图控制器寻找它的孩子的方向信息。

布兰登

检查你的项目设置和info.plist它们比应用程序代表具有更高的优先级。 确保只有你想要的方向被选中