Я столкнулся с теми же проблемами, что и вы, работая с UITabBarController. Мне нужно было контролировать, какие UIViewControllers было разрешено вращать, а какие нет. Моя главная проблема была с вкладкой БОЛЬШЕ. Я не хотел, чтобы какой-либо из контроллеров UIViewControllers, включенных во вкладку MORE, вращался.
Моим решением было создать мой собственный UITabBarController, который я назвал MyTabBarController:
@interface MyTabBarController : UITabBarController <UITabBarDelegate> {
}
Затем я реализовал метод shouldAutorotateToInterfaceOrientation:
@implementation MyTabBarController
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
UIViewController *controller = [self selectedViewController];
if ((controller == [self moreNavigationController]) || ([self selectedIndex] == 4))
{
return interfaceOrientation == UIInterfaceOrientationPortrait;
}
return [controller shouldAutorotateToInterfaceOrientation:interfaceOrientation];
}
@end
Мне нужно было узнать, была ли выбрана вкладка БОЛЬШЕ. Это двухступенчатый процесс; когда изначально выбрана вкладка MORE, API возвращает selectedIndex выше 4, поэтому мне нужно было сравнить выбранный контроллер с moreNavigationController.
Если UIViewController выбран из вкладки MORE, то selectedIndex наконец равен 4, но selectedController больше не является moreNavigationController, а выбран UIViewController.
if ((controller == [self moreNavigationController]) || ([self selectedIndex] == 4)) решает эту проблему.
Теперь, когда я запускаю свое приложение, мои UIViewControllers на вкладке БОЛЬШЕ не поворачиваются. Я надеюсь, что это поможет другим разработчикам, которые сталкиваются с теми же проблемами, что и я.
Emilio