导航控制器推送ViewControllers不会自动旋转

我很难让导航控制器正确自动旋转。 显示器将在初始视图(根视图控制器)上自动旋转,但不会在任何推入的新视图上旋转。 它保持了初始视图在推送时的视图方向。

在我的应用程序委托我有一个导航控制器,并推动它的观点。

[window addSubview:navigationController.view]; [window makeKeyAndVisible]; 

在根视图控制器中,我允许所有方向,并将其他视图推送到控制器的堆栈上。

 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { return YES; } ParkingListController *parklc = [[ParkingListController alloc] autorelease]; [[self navigationController] pushViewController:parklc animated:YES]; 

我看到“是的,我们应该!” 在新视图加载时logging一次,但实际旋转设备时不会触发。

 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { NSLog(@"Yes, we should!"); return YES; } 

我没有任何init覆盖,info.plist列出了所有四个方向。

我错过了什么? 谢谢!

编辑2011-07-07:

奇怪的是,当你从表格视图中select一个项目时推送的地图视图自动旋转! 为什么它可以在表视图来的时候旋转呢?

您正在使用UINavigationController,并且它应该返回true以便旋转。 请扩展UINavigationController并使用Interface Builder中的扩展类。

 #import <Foundation/Foundation.h> @interface IRUINavigationController : UINavigationController { } @end #import "IRUINavigationController.h" @implementation IRUINavigationController - (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{ [self.visibleViewController willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration]; } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { return YES; } @end 

我用这个是很多项目,它的工作原理。

你是否确保ParkingListController的shouldAutorotateToInterfaceOrientation也返回YES?

我会build议两件事情:

  1. 确保你所有的UIViewController的' shouldAutorotateToInterfaceOrientation返回YES;

  2. 将日志消息放在willRotateToInterfaceOrientation以validation视图对设备旋转的反应; shouldAutorotateToInterfaceOrientation是一个可以通过框架以不可预知的方式调用的方法(也就是说,自动旋转时并不总是调用它)。

除此之外,它应该工作。

推到导航控制器堆栈上的每个视图控制器都必须支持相同的方向。 这意味着不可能有一些视图控制器只支持肖像,其他人只支持景观。 换句话说,在同一导航控制器堆栈上的所有视图控制器应该在委托中返回相同的值:

 (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 

但是有一个简单的解决scheme! 这是一个从纵向到横向的例子。 这是执行它的步骤,下面是代码来支持它。

  1. 创build一个“伪”视图控制器,它将作为子导航控制器中的根。 这个视图控制器应该支持风景。
  2. 创build一个UINavigationController的新实例,以root身份添加“假”视图控制器的实例,并添加横向视图控制器的实例作为第二个视图控制器
  3. 从父视图控制器呈现UINavigationController实例作为模态

首先,用下面的代码创build一个新的视图控制器(FakeRootViewController):

 @interface FakeRootViewController : UIViewController @property (strong, nonatomic) UINavigationController* parentNavigationController; @end @implementation FaceRootViewController @synthesize parentNavigationController; // viewWillAppear is called when we touch the back button on the navigation bar (void)viewWillAppear:(BOOL)animated { // Remove our self from modal view though the parent view controller [parentNavigationController dismissModalViewControllerAnimated:YES]; } (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { return (interfaceOrientation == UIInterfaceOrientationIsLandscape(interfaceOrientation)); } 

下面是代码来呈现你想在横向模式下显示的视图控制器:

 FakeRootViewController* fakeRootViewController = [[FakeRootViewController alloc] init];[fakeRootViewController.navigationItem setBackBarButtonItem:backButton]; // Set back button // The parent navigation controller is the one containing the view controllers in portrait mode. fakeRootViewController.parentNavigationController = parentNavigationController; UINavigationController* subNavigationController = // Initialize this the same way you have initialized your parent navigation controller. UIViewController* landscapeViewController = // Initialize the landscape view controller [subNavigationController setViewControllers: [NSArray arrayWithObjects:fakeRootViewController, landscapeViewController, nil] animated:NO]; [_navigationController presentModalViewController:subNavigationController animated:YES]; 

请记住,landscapeViewController也应该有这个实现:

 (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { return (interfaceOrientation == UIInterfaceOrientationIsLandscape(interfaceOrientation)); }