У меня есть приложение, которое имеет UITabBarController
в качестве базового контроллера с UINavigationController
для двух вкладок. Оба контроллера основного вида вкладки поддерживают как книжную, так и альбомную ориентации, но представление внука должно быть только в альбомной ориентации.
Проблема, с которой я столкнулся, заключается в том, что если вы начнете в портретной ориентации, прежде чем перейти к представлению внука, представление внука будет отображаться в портрете, даже если ChildViewController's
shouldAutorotateToInterfaceOrientation
возвращает YES только для ландшафтных режимов. То есть панель навигации отображается в верхней части устройства, как будто она находится в портретном режиме, а новый контроллер вида не поворачивается в принудительную ориентацию. Это выглядит так:
| [Navigation bar] |
| |
| View contents |
| |
| |
| |
Вместо правильно ориентированного макета:
| [Navigation bar] |
| |
| View contents, rotated |
Как мне убедиться, что вид внука показан в правильной ориентации? Вот как я все настраиваю:
// first creating one of two view controllers used for the tabbar
UINavigationController *firstNavController = [[UINavigationController alloc] init];
ContentOneListController *listController = [[[ContentOneListController alloc] initWithNibName:@"ContentOneView" bundle:nil] autorelease];
listController.tabBarItem.title = @"One";
firstNavController.viewControllers = [NSArray arrayWithObject:listController];
// view controllers are added to the tabbar controller here (ivar of the class)
tabBarController = [[UITabBarController alloc] init];
tabBarController.viewControllers = [NSArray arrayWithObjects:
firstNavController, secondNavController, nil];
[window addSubview:tabBarController.view];
[window makeKeyAndVisible];
// later on, I add a child view controller onto ContentOneListController
NSArray *viewControllers = tabBarController.viewControllers;
NSInteger selectedIndex = [tabBarController selectedIndex];
UINavigationController *selectedNavController = [viewControllers objectAtIndex:selectedIndex];
// ChildViewController only supports landscape orientation
ChildViewController *childController = [[[ChildViewController alloc] initWithNibName:@"ChildView" bundle:nil] autorelease];
[selectedNavController pushViewController:controller animated:NO];
ContentOneListController's
shouldAutorotateToInterfaceOrientation
возвращает YES для поддержки книжной и альбомной ориентации, тогда как ChildViewController's
shouldAutorotateToInterfaceOrientation
возвращает YES только для альбомной ориентации:
-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)orientation
{
return (orientation == UIInterfaceOrientationLandscapeLeft ||
orientation == UIInterfaceOrientationLandscapeRight);
}