这是一个旧帖子,但由于它还没有解决。我想分享我的解决方案,为那些可能遇到问题的人提供帮助。
目标:
一个UINavigationController和其堆栈中的大多数视图控制器都固定在纵向模式下,除了堆栈中的一个视图控制器被允许旋转到纵向和横向模式。
问题:
直觉上,我通过检查topViewController是否为rotableViewController来设置一个有选择性的shouldAutorotateToInterfaceOrientation。然而,在从rotableViewController返回到横向模式后,navigationcontroller现在显示为横向模式,尽管它不被允许。
解决方法:在viewWillAppear
中禁止旋转,并呈现和取消modalViewController时不使用动画。
- 将appViewController作为主机viewController添加到窗口中,即根视图控制器;
- 在appViewController中添加navigationController,将delegate设置为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];
}
}