UINavigationController に似たナビゲーション構造を提供するビュー コントローラーを実装しました。ビューコントローラーコンテインメントを使用しています。すべてのビュー コントローラーは子として追加されます。
このナビゲーション フロー内でビュー コントローラーからモーダル ビュー コントローラーを提示すると、カスタム トランジション中に基になるビューが消え、ユーザーは下のウィンドウ ビューを表示したままになります。
[UIView animateWithDuration:0.35 animations:^{
self.view.transform = CGAffineTransformMakeScale(0.4, 0.4);
self.view.alpha = 0.0;
} completion:^(BOOL finished) {
[[self presentingViewController] dismissViewControllerAnimated:NO completion:nil];
}];
これは非常に耳障りな経験です。以前は、このアニメーションはモーダル ビュー コントローラーのビューを縮小し、その下にある表示中のビュー コントローラーのビューにフェードインしていました。前に述べたように、ユーザーはウィンドウのビューにさらされます (現在、色の値が設定されていません)。
View Controller のドキュメントを参照すると、適切なフィールドをすべて設定したように感じますが、何かが間違っています。
ビュー コントローラは、そのビュー コントローラにタスクを実行させたい場合に、別のビュー コントローラを提示します。表示側のビュー コントローラーがこの動作を担当します。提示されたView Controllerを構成し、そこから情報を受け取り、最終的にそれを破棄します。ただし、提示されている間、提示されたView Controllerのビューはウィンドウのビュー階層に一時的に追加されます。
提示ビュー コントローラーはカスタム ナビゲーション コントローラーです。提示ビュー コントローラーは、ユーザーが会話を作成できるようにするモーダル ビュー コントローラーです。アプリケーションのウィンドウ ルート ビュー コントローラーは、カスタム ナビゲーション コントローラーに対して正しく構成されています。
また、プレゼンテーション コンテキストについてさらに読み、カスタム ナビゲーション コントローラーを definePresentationContext を YES として構成しました。
ビュー コントローラーが表示されると、それがカバーする画面の部分は、別のビュー コントローラーによって提供されるプレゼンテーション コンテキストによって定義されます。プレゼンテーション コンテキストを提供するビュー コントローラーは、それを提示したビュー コントローラーと同じである必要はありません。図1-15は、図1-14に示したものと同じView Controller階層を示しています。コンテンツ ビューがビュー コントローラーを提示していることがわかりますが、プレゼンテーション コンテキストは提供されていません。代わりに、View Controller は Tab Controller によって提示されました。このため、表示側のビュー コントローラーは、タブ ビュー コントローラーによって提供される画面の一部のみをカバーしますが、表示されるビュー コントローラーは、タブ ビュー コントローラーが所有する領域全体を使用します。カスタム ナビゲーション コントローラー内では、ビュー コントローラーの表示または破棄に関連するメソッドをオーバーライドしていません。追加されるすべての子ビュー コントローラーはすべて childViewControllers として追加され、それらのビューはこのカスタム ナビゲーション コントローラーに追加されています。
- プレゼンテーション コンテキストを提供するカスタム コンテインメント ビュー コントローラーを尊重する代わりに、カスタム トランジションがウィンドウのビューを表示するのはなぜですか?
- 従来のトランジション アニメーションが期待どおりに機能するのはなぜですか?