iOS 6旋转问题 – 来自所呈现的模态视图控制器的旋转

我有一个MainViewController,它有一个button,通过翻转horizo​​ntailly推新视图(InfoViewController)。 像这样:

controller.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; [self presentModalViewController:controller animated:YES]; 

MainView控制器支持Portrait和PortraitUpsideDown。 像这样:

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

在我的InfoViewController中,它也说明了上面的代码。 在我的AppDelegate中它有这LaunchOptions:

 [self.window setRootViewController:self.mainViewController]; 

在我的app.plist文件中,它支持所有的方向。 这是因为其他观点也需要支持风景。 所以在我的MainViewController和InfoViewController我只需要肖像和PortraitUpsideDown。 但从另一个angular度来看,我需要所有的信息。

我的MainViewController工作正常,但我的InfoViewController适用于所有的方向。

我有极大的困难,试图让这个工作在iOS6。 我研究过其他的post,试过别人提供的帮助,但没有任何运气。 请有人能帮我实现这个谢谢。 我是一个Objective-C的新手:p

不要支持您的应用程序plist文件中的所有方向,只支持您的根视图控制器支持的方向。

自动旋转在iOS 6中正在改变。在iOS 6中,不推荐使用UIViewController的shouldAutorotateToInterfaceOrientation:方法。 在它的地方,你应该使用supportedInterfaceOrientationsForWindow:shouldAutorotate方法:

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

在iOS 6中,Modal ViewControllers不再调用旋转调用: willRotateToInterfaceOrientation:duration:, willAnimateRotationToInterfaceOrientation:duration:,didRotateFromInterfaceOrientation:方法不再在任何视图控制器上进行全屏演示 – 例如被调用的视图控制器with: presentViewController:animated:completion:

您可以让呈现您的模式视图控制器的视图控制器通知它的旋转。 另外,现在您使用: presentViewController:animated:completion:呈现视图控制器。 presentModalViewController:animated:已被弃用,您在代码中使用。

我已经解决了类似的问题,而使用标签栏控制器。

子类UITabBarController。 实现这些方法:

 - (NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskAll; } - (BOOL)shouldAutorotate { NSLog(@"Orientation:%d", [[UIDevice currentDevice] orientation]); for (UIViewController *viewController in self.viewControllers) { [viewController shouldAutorotate]; } return YES; } 

如果你想在tabbarcontroller内部的控制器中处理旋转,那么标签栏控制器中的每个控制器也会实现这些方法,并编写代码来处理方向的变化。 如果你不想处理它,那么你不需要实现这些方法。 TabBarControllers方法将始终在方向更改时运行。 甚至两次不明原因。

是的,不要忘记删除所有shouldAutorotate方法。 我完全转向了新的定位模式。 如果你想让他们保持,可能会更困难。

通过inheritanceUINavigationController来创build一个类别,并在.h文件中实现以下方法

 -(BOOL)shouldAutorotate; -(NSUInteger)supportedInterfaceOrientations; - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation; in .m file -(BOOL)shouldAutorotate { return [self.topViewController shouldAutorotate]; } -(NSUInteger)supportedInterfaceOrientations { return [self.topViewController supportedInterfaceOrientations]; } -(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation { return [self.topViewController preferredInterfaceOrientationForPresentation]; } 

并在视图控制器类中实现以下方法,类u要启用旋转

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

将此代码添加到子类UITabBarController .m

 @implementation UINavigationController (rotation) //temp hack for iOS6, this allows passing supportedInterfaceOrientations to child viewcontrollers. - (NSUInteger)supportedInterfaceOrientations { return [self.topViewController supportedInterfaceOrientations]; } @end @implementation NameClassUITabBar - (void)viewDidLoad { [super viewDidLoad]; } - (BOOL)shouldAutorotate { return YES; } - (NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskLandscape; } @end 

在这里,我已经发布了我的解决scheme/经验与旋转标签栏控制器: http : //luterr.blogspot.sg/2015/04/example-code-uiinterfaceorientationmask.html