これを行う優れた方法の 1 つは、iOS5+ の UIViewController の子 UIViewController を持つ機能を使用することです (ビュー コントローラー コンテインメントと呼ばれます)。これを詳細に説明している WWDC ビデオを見るまで、これを行う方法を理解するのに苦労しました。
簡単に言えば、一連の子View Controllerを所有する独自の親View Controllerを作成できます。この 1 つの親ビュー コントローラーは、アプリのウィンドウのルート ビュー コントローラーとして使用できます (非常に凝ったことをしている場合を除き、おそらくそうすべきです:P)。1 つのビュー コントローラーを親として機能させる (そして、子ビュー コントローラーの追加、削除、および遷移を容易にする) この方法は、UINavigationController が行うこと (Apple の意図) を思い起こさせます。これで、独自の UINavigationController のような親ビュー コントローラーを作成できますが、遷移アニメーションと UI はまったく異なります。
例として、親ビュー コントローラーの viewDidLoad に、次のように最初の子コントローラーを追加します。
self.currentlyDisplayedChildViewController = [[TheFirstViewController alloc] init];
[self addChildViewController:self.currentlyDisplayedChildViewController];
[self.view addSubview:self.currentlyDisplayedChildViewController.view];
[self.currentlyDisplayedChildViewController didMoveToParentViewController:self];
次に、次の子ビュー コントローラーへの移行を行う関数を用意します(注: この関数は、親ビュー コントローラー (UINavigationController として機能するビュー コントローラー) に属します) :
- (void)transitionToViewController:(UIViewController *)nextChildViewController
{
[self addChildViewController:nextChildViewController];
__weak TheParentViewController *me = self;
[self transitionFromViewController:self.currentlyDisplayedChildViewController
toViewController:nextChildViewController
duration:1.0f
options:UIViewAnimationOptionTransitionFlipFromLeft
animations:nil
completion:^(BOOL finished)
{
[nextChildViewController didMoveToParentViewController:self];
[me.currentlyDisplayedChildViewController willMoveToParentViewController:nil];
[me.currentlyDisplayedChildViewController removeFromParentViewController];
me.currentlyDisplayedChildViewController = nextChildViewController;
}];
}
本当に素晴らしいことの 1 つは、すべての標準の UIViewAnimationTransition オプションを使用できる (またはアニメーション ブロックで独自のカスタム アニメーションを定義できる) ことです。さらに、向きの回転イベントは親ビュー コントローラーから子ビュー コントローラーに自動的に転送されます。これはその 1 つです。自分でカスタム ルート ビュー コントローラーを操作する際の最も厄介な問題。
「Implementing UIViewController Containment」というタイトルの WWDC2011 ビデオをご覧になることをお勧めします。