每个推入导航控制器栈的视图控制器都必须支持相同的方向。这意味着不可能有一些视图控制器仅支持纵向,而其他视图控制器仅支持横向。换句话说,同一导航控制器栈上的所有视图控制器在委托中应返回相同的内容:
(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
但是这个问题有一个简单的解决方案!以下是从竖屏到横屏的示例。以下是执行步骤和支持步骤的代码。
- 创建一个“虚拟”视图控制器,将其作为子导航控制器的根。该视图控制器应支持横向模式。
- 创建一个新的
UINavigationController
实例,将“虚拟”视图控制器作为根视图控制器,并将您的横向视图控制器作为第二个视图控制器添加进去。
- 从父视图控制器以modal形式展现
UINavigationController
实例。
首先,使用以下代码创建一个新的视图控制器(FakeRootViewController):
@interface FakeRootViewController : UIViewController
@property (strong, nonatomic) UINavigationController* parentNavigationController;
@end
@implementation FaceRootViewController
@synthesize parentNavigationController;
(void)viewWillAppear:(BOOL)animated {
[parentNavigationController dismissModalViewControllerAnimated:YES];
}
(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
return (interfaceOrientation == UIInterfaceOrientationIsLandscape(interfaceOrientation));
}
以下是以横屏模式展示视图控制器的代码:
FakeRootViewController* fakeRootViewController = [[FakeRootViewController alloc] init];[fakeRootViewController.navigationItem setBackBarButtonItem:backButton];
fakeRootViewController.parentNavigationController = parentNavigationController;
UINavigationController* subNavigationController =
UIViewController* landscapeViewController =
[subNavigationController setViewControllers:
[NSArray arrayWithObjects:fakeRootViewController,
landscapeViewController, nil] animated:NO];
[_navigationController presentModalViewController:subNavigationController animated:YES];
请记住,landscapeViewController 也应该有这个实现:
(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
return (interfaceOrientation == UIInterfaceOrientationIsLandscape(interfaceOrientation));
}