以下のようにすることで、それぞれのViewごとに回転を制御できるようになります。
TabBarControllerとNavigationBarでは直接画面制御の判定をせず、実際に表示されるView側で判定をするという仕組みです。
なお、各メソッドは、
shouldAutorotate
-> supportedInterfaceOrientations
-> preferredInterfaceOrientationForPresentation
という順番で呼び出されるため、仮に回転をさせない画面(shouldAutorotate = NO の場合)には、それ以外のメソッドを実装する必要は無いようです。
MyTabController.m
#pragma mark - Rotate
- (BOOL)shouldAutorotate
{
return [self.selectedViewController shouldAutorotate];
}
- (NSUInteger)supportedInterfaceOrientations
{
return [self.selectedViewController supportedInterfaceOrientations];
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
return [self.selectedViewController preferredInterfaceOrientationForPresentation];
}
MyNavigationController.m
#pragma mark - Rotate
- (BOOL)shouldAutorotate
{
return [self.viewControllers.lastObject shouldAutorotate];
}
- (NSUInteger)supportedInterfaceOrientations
{
return [self.viewControllers.lastObject supportedInterfaceOrientations];
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
return [self.viewControllers.lastObject preferredInterfaceOrientationForPresentation];
}
MyViewController.m
#pragma mark - Rotate
- (BOOL)shouldAutorotate
{
return YES;
}
- (NSUInteger)supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskAllButUpsideDown;
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
return UIInterfaceOrientationPortrait;
}