2013-04-24 2 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가 보일 때 나는 노란 색을 볼 수 없다, 그때 그것의 viewDidAppear 메서드에서 myVC.view.superView를 점검했고 그것은 UIWindow이다.

1x. 그 의미는 모달 창이 올라갈 때까지 위의 경우에있는 presentingViewController.view (위의 경우 self.view)가 뷰 계층 구조에서 제거되고 presentViewController.view (위의 경우 myVC.view)가 UIWindow를 통해 추가됩니까?

질문 2. myVC.modalPresentationStyle! = UIModalPresentationFullScreen 인 경우 어떻게됩니까?

3. iOS는 전체 화면 모달 대화 상자가 최적화 될 때까지 presentViewController.view를 제외하고 UIWindow에서 모든보기를 제거합니까? 왜 안되면?

+0

'clippingVC'란 무엇입니까? – rptwsthi

답변

18

먼저 애니메이션이없는 경우에 대해 살펴 보겠습니다.

present를 호출하기 전에 :

  1. 당신의 창은 그 rootViewController보기에서 하나 개의 뷰 계층 시작했다.

present:

  1. 를 호출 한 후 뷰 계층 구조는 여전히 변화없이 존재한다.
  2. "디밍보기"라고하는 특별한 전체 화면보기가 창에 추가됩니다 (즉, rootViewController의보기 내부가 아니라 창 내부에 있음) (창은 UIView 임).이보기는 투명하며 희미하게 보입니다. 제시 controler를 차단 사용자 상호 작용.
  3. 은 제시된 (모달) 컨트롤러의 뷰는 다음 창으로도 추가됩니다.

창 및 제시 컨트롤러의 창 사이에 추가 다른 의견이있다. 당신이 로그인하는 경우 뷰 계층 구조에서는 _ControllerWrapperView 또는 이와 유사한 클래스가 표시되지만 iOS 버전 간에는 변경되었으므로 뷰에 의존해서는 안됩니다. 구조. 모달 컨트롤러는 창의 직접 하위보기가 아니며 컨트롤러와 창 사이의 래퍼가 투명하지 않으므로 투명하지 않을 수 있습니다.

애니메이션 사례는 거의 같습니다. 단계들 사이에는 환상적인 애니메이션 만 있습니다.

편집 2 : 대답은 실제로 약간 잘못되었습니다. iPhone과 iPad 사이에는 큰 차이가 있습니다.

iPhone의 경우 표시된 컨트롤러는 항상 전체 화면으로 표시되고 제시되는 컨트롤러는 실제로 창에서 제거됩니다.

iPad의 경우 표시된 컨트롤러가 전체 화면이 아닌 경우 (UIModalPresentationStyle 참조), 표시된 컨트롤러가 창에 그대로 있습니다.

질문 : 모달 창 위의 경우에서보기 계층 구조 및 presentedViewController.view (myVC.view에서 제거 (위의 경우에서 self.view가) presentingViewController.view 최대가 될 때까지

그 의미인가)가 UIWindow에 추가됩니까?

컨트롤러가 전체 화면 인 경우이 표시는 true입니다. 그렇지 않으면 프리젠 테이션 뷰 컨트롤러는 그대로 있지만 반투명 한 경우에도 전체 내용이 다른 뷰와 겹쳐집니다. 또한 제시된 컨트롤러보기와 제시된 컨트롤러보기 사이에는 항상 일부보기가 있습니다.

myVC.modalPresentationStyle! = UIModalPresentationFullScreen?

이전 질문에 대한 답변을 참조하십시오 - 아이폰에 차이가 없을 것이다.

iOS는 전체 화면 모달 대화 상자가 최적화되기 전까지는 displayedViewController.view를 제외한 모든보기를 UIWindow에서 제거합니까? 왜 안되면?

내 테스트에서 제시하는 컨트롤러 만 창 계층 구조에서 제거되었습니다. 이것은 아마도 드로잉 성능을 최적화하기위한 것입니다. 이것은 시스템이 안전하게 제거 할 수있는 유일한 컨트롤러입니다. 다른보기를 삭제하면 문제가 발생할 수 있습니다 (예 : 항상 볼 수있는보기).

편집 : 당신이 투명 컨트롤러를 확인하려면, 당신은 할 수 :

  1. 는 전환 애니메이션으로보기 계층 구조 (중 컨트롤러의 뷰 또는 창)에 직접 뷰를 추가 (+[UIView transition...])
  2. 동일하지만 컨트롤러에 하위 컨트롤러를 추가 할 수도 있습니다.
+2

이 답변은 다소 잘못되었습니다. 모달 전체 화면 컨트롤러가 표시되면 UIKit은 다른 컨트롤러의보기를 창에서 제거합니다. 사실, 윈도우에서의 추가/제거는 정확히'-viewDid/Will (Dis) ::'메소드가보고하는 것입니다. 그러나 UIKit은 다시 돌아 가기 전에 다시 창에 추가합니다. –

+1

@BJHomer 당신이 옳았어요. 나는 대부분 iPhone 테스트를 가지고있어서 iPhone 케이스에서 착각했습니다. 답변이 수정되었습니다. – Sulthan

+0

이것은 나의 실험에서 나온 것입니다 -> "제시하는 컨트롤러 만이 창 계층 구조에서 제거되었습니다". iOS가 창 계층 구조에서 다른 모든보기를 절대로 제거 할 수 없기를 바랍니다. @BJ Homer는 "모달 전체 화면 컨트롤러가 제시되면 UIKit은 다른 컨트롤러의 뷰를 창에서 제거합니다." – msk

관련 문제