这是一个旧帖子,但因为它还没有解决。我想分享我的解决方案,以供其他可能头疼的人使用。
Objective: UINavigationController 和它的堆栈中的大多数视图控制器固定在纵向,除了堆栈中的一个视图控制器被允许旋转到纵向和横向。
问题:直观地,我通过检查 topViewController 是否是 rotableViewController 来设置选择性的 shouldAutorotateToInterfaceOrientation。然而,在横向模式下从 rotableViewController 弹出后,导航控制器现在以横向模式显示,尽管这是不允许的。
解决方案:杀手锏是在没有动画的情况下禁止旋转viewWillAppear
并显示和关闭 modalViewController。
- 一个appViewController作为宿主viewController添加到窗口中,即比RootViewController更root;
- 一个navigationController被添加到appViewController,委托设置为appViewController;
- 在 AppViewController 中
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
if (interfaceOrientation == UIInterfaceOrientationPortrait) return YES;
return canRotate;
}
- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
[viewController viewDidAppear:animated];
canRotate = ([navigationController.topViewController isKindOfClass:[MyRotatable class]]);
}
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
[viewController viewWillAppear:animated];
if (![navigationController.topViewController isKindOfClass:[MyRotatable class]]) {
canRotate = NO;
UIViewController * blanck = [[UIViewController alloc] initWithNibName:nil bundle:nil];
[self presentModalViewController:blanck animated:NO];
[self dismissModalViewControllerAnimated:NO];
[blanck release];
}
}