別の回答で、iOS 6では、新しいViewControllerをナビゲーションコントローラーにプッシュするときに強制的に回転させることはサポートされていないことを説明しました。代償回転に関するルール(つまり、ユーザーがデバイスを回転させた場合にどうなるか)を構成することはできますが、インターフェイスを強制的に回転させることはできません。iOS 6で強制的に回転させることができるのは、View Controller(presentViewController:animated:
およびdismissViewControllerAnimated:
)を表示または非表示にするときだけです。
ただし、表示されたView Controllerを、ナビゲーションコントローラーを押しているように見えるように使用することは可能です。私は私が何を意味するかを示す映画を作りました:
http://youtu.be/O76d6FhPXlE
さて、それは決して完全ではありません。ステータスバーの回転アニメーションはなく、2つのビューの間に一種の黒い「点滅」があります。これは、実際に起こっていることを隠すためにあるため、意図的なものです。ストーリーボードのこのスクリーンショットに示されているように、実際に起こっているのは、実際には2つの異なるナビゲーションコントローラーと3つのビューコントローラーがあるということです。
私たちが持っているのは:
縦向きに設定されたnavコントローラーサブクラスとそのルートビューコントローラー
横向きに設定された2番目のnavコントローラーサブクラスと、黒で中間として機能するそのルートビューコントローラー
2番目のナビゲーションコントローラーのスタックにプッシュされる3番目のビューコントローラー
ユーザーが最初のViewControllerから「進む」ように要求すると、2番目のナビゲーションコントローラーが表示され、黒いView Controllerが一時的に表示されますが、すぐに3番目のViewControllerを押します。そのため、一種の黒いフラッシュとプッシュアニメーションとともに、強制的な回転が行われます。ユーザーが3番目のViewControllerの[戻る]ボタンをタップすると、プロセスが逆になります。
すべての移行コードは、黒いビューコントローラー(ViewControllerIntermediary)にあります。私はそれを微調整して、私ができる最も満足のいくアニメーションを提供しようとしました:
@implementation ViewControllerIntermediary {
BOOL _comingBack;
}
- (void) viewDidLoad {
[super viewDidLoad];
self.navigationController.delegate = self;
}
-(void)navigationController:(UINavigationController *)nc
willShowViewController:(UIViewController *)vc
animated:(BOOL)anim {
if (self == vc)
[nc setNavigationBarHidden:YES animated:_comingBack];
else
[nc setNavigationBarHidden:NO animated:YES];
}
-(void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
if (!_comingBack) {
[self performSegueWithIdentifier:@"pushme" sender:self];
_comingBack = YES;
}
else
[self.navigationController dismissViewControllerAnimated:YES
completion:nil];
}