残念ながら、UITabBarController は、異なる回転要件を持つビュー コントローラーをうまく処理できません。これを処理する最善の方法は、UITabBarController をサブクラス化し、shouldAutorotate で、画面上のビュー コントローラーに要求を渡すだけです。コードは次のようになります。
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
// Let's grab an array of all of the child view controllers of this tab bar controller
NSArray *childVCArray = self.viewControllers;
// We know that at 5 or more tabs, we get a "More" tab for free, which contains, assumingly,
// a more navigation controller
if (self.selectedIndex <= 3) {
UINavigationController *navController = [childVCArray objectAtIndex:self.selectedIndex];
// We're in one of the first four tabs, which we know have a top view controller of UIViewController
UIViewController *viewController = navController.topViewController;
return [viewController shouldAutorotateToInterfaceOrientation:interfaceOrientation];
}
else {
// This will give us a More Navigation Controller
UIViewController *viewController = [childVCArray objectAtIndex:self.selectedIndex];
return [viewController shouldAutorotateToInterfaceOrientation:interfaceOrientation];
}
return NO;
}
これは、5 つ以上のビュー コントローラーがタブ バーのナビゲーション コントローラーを使用しており、それ自体が独自の uinavigationcontroller に含まれていないことを前提としています。もしそうなら、このコードをそれに合わせて変更するのは簡単です。
このサブクラスを github に投稿したので、このメソッドをコピーするか、ここから .h/.m ファイルを取得してください。