アプリにカスタムコンテナビューコントローラーがありますが、iOS5で行ったのと同じ回転動作をiOS6で実現できませんでした。
コンテナ(containerVCと呼びます)には、2つのView Controllerがあります。1つは縦向きのままにする必要があり(portraitVC)、もう1つは横向きに回転できます(rotatingVC)。セグメント化されたコントロールを使用してそれらを切り替えます。
最初にportraitVCが表示された状態でcontainerVCを開いてから、電話機を横向きに回転させると、portraitVCが正しく回転しません。しかし、rotatingVCに切り替え、横向きに回転してから、電話機を横向きにしたままportraitVCに切り替えると、portraitVCの描画が誤って横向きに描画されます。
iOS 5では、portraitVCは常に縦向きのままです。
ビューコントローラを切り替えるためのcontainerVCに次のコードがあります。
- (IBAction)segmentChanged:(id)sender {
UIViewController *toViewController = [self viewControllerForSegmentIndex:self.selectedSegmentIndex];
[self addChildViewController:toViewController];
UIViewController *fromViewController = self.selectedViewController;
[self transitionFromViewController:self.selectedViewController
toViewController:toViewController
duration:0
options:0
animations:^{}
completion:^(BOOL finished) {
self.selectedViewController = toViewController;
[toViewController didMoveToParentViewController:self];
[fromViewController removeFromParentViewController];
}];
}
回転を処理するためのcontainerVC内のこれ:
- (NSUInteger)supportedInterfaceOrientations {
UIInterfaceOrientationMask mask = UIInterfaceOrientationMaskPortrait;
if ([self.selectedViewController respondsToSelector:@selector(supportedInterfaceOrientations)] ) {
mask = [self.selectedViewController supportedInterfaceOrientations];
}
return mask;
}
これはportraitVCで:
- (NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskPortrait;
}
そしてこれはrotatingVCで:
- (NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskAll;
}
回転VCを選択した後にportraitVCを選択すると、containerVCまたはportraitVCで回転メソッドまたはコールバックが呼び出されません。外観メソッドが呼び出され、テーブルビューを保持するportraitVCは、テーブルビューコールバックでランドスケープジオメトリを持つUITableViewCellsを取得します。
PortraitVCをランドスケープにサポートする必要があるのは世界の終わりではありませんが、アプリの他の部分との一貫性を保つために、可能であれば優先しません。組み込みのコンテナVCは、サブクラス化してsupportedInterfaceOrientationsをオーバーライドすると正しく機能するため、これを機能させる方法があるはずです。