14

以下のコードを考えると

self.view.backgroundColor = [UIColor yellowColor];
MyViewController *myVC = [[MyViewController alloc] initWithNibName:@"MyView" bundle:nil]
myVC.view.backgroundColor = [UIColor clearColor];
myVC.modalPresentationStyle = UIModalPresentationFullScreen;
[self presentViewController:myVC animated:NO completion:nil];

presentViewController を呼び出すと、内部で何が起こるでしょうか? myVC が表示されているときに黄色が見えない場合は、viewDidAppear メソッドで myVC.view.superView をチェックしましたが、それは UIWindow です。

Q1. モーダル ウィンドウが表示されるまで、presentingViewController.view (上記の場合は self.view) がビュー階層から削除され、presentedViewController.view (上記の場合は myVC.view) が UIWindow に追加されるまでということですか?

Q2. myVC.modalPresentationStyle != UIModalPresentationFullScreen の場合はどうなりますか?

Q3. iOS は、全画面モーダル ダイアログが最適化されるまで、presentedViewController.view を除くすべてのビューを UIWindow から削除しますか? いいえの場合、なぜですか?

4

1 に答える 1

18

まず、アニメーションなしのケースについて説明しましょう。

電話する前にpresent

  1. ウィンドウには、そのrootViewControllerビューから始まる 1 つのビュー階層があります。

通話後present:

  1. ビュー階層は変更なしで引き続き存在します。
  2. 「調光ビュー」と呼ばれる特別なフルスクリーン ビューがウィンドウに追加されます (つまり、rootViewControllerのビューの内側ではなく、ウィンドウの内側です (ウィンドウUIViewも です)。このビューは透過的で、表示中のコントローラーを暗くし、ユーザーをブロックします)。交流。
  3. 提示された (モーダル) コントローラーのビューもウィンドウに追加されます。

ウィンドウと提示されたコントローラーのウィンドウの間にいくつかのビューが追加されています。ビュー階層をログに記録すると、名前が付けられたクラス_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 から削除しますか? いいえの場合、なぜですか?

私のテストでは、表示中のコントローラーのみがウィンドウ階層から削除されます。これはおそらく描画パフォーマンスを最適化するためです。これは、システムが安全に取り外すことができる唯一のコントローラーです。他のビューを削除すると、問題が発生する可能性があります (常に表示されるべきビューなど)。

編集: 透明なコントローラーを作成する場合は、次のことができます。

  1. +[UIView transition...]遷移アニメーション ( )を使用して、ビューをビュー階層 (コントローラーのビューまたはウィンドウ) に直接追加します。
  2. 同じですが、コントローラーに子コントローラーを追加します。
于 2013-04-28T18:39:56.017 に答える