2013-04-24 9 views
14

は、私たちがpresentViewControllerを呼び出すボンネットの下に何が起こる以下のコードpresentViewControllerを実行すると何が起こるのですか?

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]; 

を考えると? myVCが表示されているときに黄色が表示されない場合、myVC.view.superViewをviewDidAppearメソッドでチェックし、UIWindowです。

Q1。モーダルウィンドウが表示されるまで、その意味はありますか?上のケースでは、presentingViewController.view(self.view)がビュー階層から削除され、presentViewController.view(上記の場合はmyVC.view)がUIWindowに追加されますか?

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

Q3。 iOSは、フルスクリーンモーダルダイアログが最適化されるまで、presentViewController.viewを除くUIWindowからすべてのビューも削除しますか?なぜいけないのですか?

+0

「clippingVC」とは何ですか? – rptwsthi

答えて

18

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

presentを呼び出す前に:

  1. あなたのウィンドウは、そのrootViewControllerビューから1つのビュー階層開始しました。

present:

  1. を呼び出した後、ビュー階層は、まだ変化なしに存在しています。
  2. 「調光表示」と呼ばれる特別な全画面表示がウィンドウに追加されます(つまり、rootViewControllerのビュー内ではなくウィンドウ内です(ウィンドウはUIViewでもあります)。 。
  3. のcontrolerとブロックユーザーとの対話を提示する提示(モーダル)コントローラのビューが、ウィンドウにも追加されます。

ウィンドウと提示コントローラのウィンドウの間に追加されたいくつかの他のビューがあります。あなたがログインした場合ビュー階層では、_ControllerWrapperViewなどのクラスが表示されますが、これはiOSバージョン間で変更されており、ビューに頼るべきではありません構造。 モーダルコントローラは、ウィンドウの直接的なサブビューではなく、コントローラとウィンドウ間のラッパーが透過的ではないため、透明にすることはできません。

アニメーションのケースはほとんど同じです。ステップ間には派手なアニメーションしかありません。

編集2: 答えは本当に間違っていました。 iPhoneとiPadの間には大きな違いがあります。

iPhoneでは、提示されたコントローラは常にフルスクリーンで表示され、プレゼンテーションコントローラは実際にウィンドウから削除されます。

提示されたコントローラがフルスクリーンでない場合(UIModalPresentationStyleを参照)、プレゼンテーションコントローラはウィンドウにとどまります。

ご質問:モーダルウィンドウは、上記の場合ではビュー階層とpresentedViewController.view(myVC.viewから削除されます(上記の場合self.view)がpresentingViewController.viewアップするまで

は、その平均であります)がUIWindowに追加されましたか?

コントローラーがフルスクリーンの場合、この主張は真です。それ以外の場合、プレゼンテーションビューコントローラはそこにとどまりますが、内容全体が他のビューと重複しています(半透明であっても)。また、提示されたコントローラビューと提示されたコントローラビューとの間には、常にいくつかのビューが存在する。

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

前の質問への回答を参照してください - iPhoneでは、違いはありません。

iOSは、フルスクリーンモーダルダイアログボックスが最適化されるまで、presentViewController.viewを除くすべてのビューをUIWindowから削除しますか?なぜいけないのですか?

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

編集:あなたが透明コントローラを作りたい場合は、次のことができ :

  1. は、トランジションアニメーションを使用してビュー階層(いずれかのコントローラのビューまたはウィンドウに)に直接ビューを追加します。 (+[UIView transition...]
  2. 同じですが、コントローラに子コントローラを追加することもできます。
+2

この回答はやや間違っています。モーダルフルスクリーンコントローラが表示されると、UIKitは他のコントローラのビューをウィンドウから削除します。実際、ウィンドウからの追加/削除は、 '-viewDid/Will(Dis)が出現する:'メソッドが報告しているものとまったく同じです。しかし、UIKitはそれらを元に戻す前にウィンドウに戻します。 –

+1

@BJHomerあなたは正しいです。私は主にiPadの実験をしていたので、私はiPhoneのケースで間違っていた。答えを修正しました。 – Sulthan

+0

これは私の実験からのものです - > "提示しているコントローラだけがウィンドウ階層から削除されました"。 iOSがウィンドウ階層から他のすべてのビューを削除することは決してできないことを願っています。 @BJ Homerは、 "モーダルフルスクリーンコントローラが提示されると、UIKitは他のコントローラのビューをウィンドウから削除します。 – msk

関連する問題