Как сказал timokhin информация о ориентации берется из корневого контроллера, если у вас корень это navigationController, то создаем класс и наследуем его от UINavigationController.
Добавляем три метода которые берут значение из верхнего контроллера:
//
// NavigationController.h
//
#import <UIKit/UIKit.h>
@interface NavigationController : UINavigationController
@end
//
// NavigationController.m
//
#import "NavigationController.h"
@implementation NavigationController
-(BOOL)shouldAutorotate
{
return [self.topViewController shouldAutorotate];
}
-(NSUInteger)supportedInterfaceOrientations
{
return [self.topViewController supportedInterfaceOrientations];
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
return [self.topViewController preferredInterfaceOrientationForPresentation];
}
@end
теперь в самих вьюконтроллерах начнут работать методы
- (NSUInteger)supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft;
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return YES;
}
У меня например, в корне кастомный таббарконтроллер, а в нем уже контроллеры завернутые в UINavigationController, я добавил методы:
- (BOOL)shouldAutorotate
{
UIViewController *viewController = [(UINavigationController *)self.selectedViewController topViewController];
return [viewController shouldAutorotate];
}
- (NSUInteger)supportedInterfaceOrientations
{
UIViewController *viewController = [(UINavigationController *)self.selectedViewController topViewController];
return [viewController supportedInterfaceOrientations];
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
UIViewController *viewController = [(UINavigationController *)self.selectedViewController topViewController];
return [viewController preferredInterfaceOrientationForPresentation];
}
с стандартным UITabBarController думаю будет так же