まず、アニメーションなしのケースについて説明しましょう。
電話する前にpresent
:
- ウィンドウには、その
rootViewController
ビューから始まる 1 つのビュー階層があります。
通話後present:
- ビュー階層は変更なしで引き続き存在します。
- 「調光ビュー」と呼ばれる特別なフルスクリーン ビューがウィンドウに追加されます (つまり、
rootViewController
のビューの内側ではなく、ウィンドウの内側です (ウィンドウUIView
も です)。このビューは透過的で、表示中のコントローラーを暗くし、ユーザーをブロックします)。交流。
- 提示された (モーダル) コントローラーのビューもウィンドウに追加されます。
ウィンドウと提示されたコントローラーのウィンドウの間にいくつかのビューが追加されています。ビュー階層をログに記録すると、名前が付けられたクラス_ControllerWrapperView
または類似したクラスが表示されます。ただし、これは iOS バージョン間で変更されているため、ビュー構造に依存するべきではありません。モーダル コントローラーは、ウィンドウの直接のサブビューではなく、コントローラーとウィンドウの間のラッパーが透明ではないため、透明にすることはできないことに注意してください。
アニメの場合もほぼ同じです。ステップ間にいくつかの派手なアニメーションがあるだけです。
編集 2:
答えは本当に少し間違っていました。iPhone と iPad で提示されたコントローラーには大きな違いがあります。
iPhone では、提示されたコントローラーは常に全画面表示され、提示されているコントローラーは実際にはウィンドウから削除されます。
iPad では、提示されたコントローラーがフルスクリーンでない場合 (「 」を参照UIModalPresentationStyle
)、提示しているコントローラーはウィンドウ内にとどまります。
あなたの質問:
モーダル ウィンドウが表示されるまで、presentingViewController.view (上記の場合は self.view) がビュー階層から削除され、presentedViewController.view (上記の場合は myVC.view) が UIWindow に追加されるまでということですか?
コントローラーが全画面表示の場合、この主張は真です。それ以外の場合、表示側のビュー コントローラーはそこにとどまりますが、コンテンツ全体が他のビューと重なって表示されます (半透明であっても)。また、提示されたコントローラー ビューと提示しているコントローラー ビューの間には、常にいくつかのビューがあります。
myVC.modalPresentationStyle != UIModalPresentationFullScreen の場合はどうなりますか?
前の質問への回答を参照してください。iPhone では違いはありません。
iOS は、全画面モーダル ダイアログが最適化されるまで、presentedViewController.view を除くすべてのビューを UIWindow から削除しますか? いいえの場合、なぜですか?
私のテストでは、表示中のコントローラーのみがウィンドウ階層から削除されます。これはおそらく描画パフォーマンスを最適化するためです。これは、システムが安全に取り外すことができる唯一のコントローラーです。他のビューを削除すると、問題が発生する可能性があります (常に表示されるべきビューなど)。
編集:
透明なコントローラーを作成する場合は、次のことができます。
+[UIView transition...]
遷移アニメーション ( )を使用して、ビューをビュー階層 (コントローラーのビューまたはウィンドウ) に直接追加します。
- 同じですが、コントローラーに子コントローラーを追加します。