2013-04-24 28 views
14

Với mã dưới đâyĐiều gì xảy ra dưới mui xe khi chúng tôi thực hiện 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]; 

gì xảy ra dưới mui xe khi chúng ta gọi là presentViewController? Khi myVC hiển thị, tôi không thể thấy màu vàng, sau đó tôi đã kiểm tra myVC.view.superView trong phương thức viewDidAppear của nó và nó là UIWindow.

Q1. Điều đó có nghĩa là cho đến khi cửa sổ phương thức hiển thịViewController.view (self.view trong trường hợp trên) được loại bỏ khỏi hệ thống phân cấp View và presentationViewController.view (myVC.view trong trường hợp trên) được thêm vào UIWindow?

Q2. Điều gì sẽ xảy ra nếu myVC.modalPresentationStyle! = UIModalPresentationFullScreen?

Q3. iOS cũng loại bỏ tất cả các khung nhìn từ UIWindow ngoại trừ presentationViewController.view cho đến khi hộp thoại toàn màn hình có được tối ưu hóa không? Nếu KHÔNG tại sao không?

+0

'clippingVC' là gì? – rptwsthi

Trả lời

18

Trước tiên, hãy thảo luận trường hợp không có hoạt ảnh.

Trước khi gọi present:

  1. cửa sổ của bạn đã một cái nhìn hệ thống phân cấp, bắt đầu từ rootViewController quan điểm của mình.

Sau khi gọi present:

  1. Các hệ thống phân cấp view vẫn còn tồn tại mà không cần thay đổi.
  2. Chế độ xem toàn màn hình đặc biệt được gọi là "chế độ xem mờ" được thêm vào cửa sổ (nghĩa là không phải bên trong khung nhìn của rootViewController nhưng bên trong cửa sổ (cửa sổ cũng là UIView). trình bày khiển và khối tương tác người dùng.
  3. các giới (modal) điều khiển của quan điểm sau đó được thêm vào cũng vào cửa sổ.

có một số quan điểm khác thêm vào ở giữa cửa sổ và cửa sổ điều khiển được trình bày của. Nếu bạn đăng nhập hệ thống phân cấp chế độ xem của bạn, bạn sẽ thấy các lớp có tên là _ControllerWrapperView hoặc tương tự. Tuy nhiên, điều này đã thay đổi giữa các phiên bản iOS và bạn không nên dựa vào chế độ xem kết cấu. Lưu ý rằng bộ điều khiển phương thức không bao giờ có thể trong suốt vì nó không phải là chế độ xem trực tiếp của cửa sổ và các trình bao bọc giữa bộ điều khiển và cửa sổ không trong suốt.

Trường hợp hoạt ảnh gần như giống nhau. Chỉ có một số hình ảnh động ưa thích giữa các bước.

Chỉnh sửa 2: Câu trả lời thực sự không chính xác. Có một sự khác biệt lớn giữa bộ điều khiển trình bày iPhone và iPad.

Trên iPhone, bộ điều khiển được trình bày luôn hiển thị toàn màn hình và bộ điều khiển trình bày thực sự bị xóa khỏi cửa sổ.

Trên iPad, nếu bộ điều khiển được trình bày không ở chế độ toàn màn hình (xem UIModalPresentationStyle), bộ điều khiển trình bày vẫn nằm trong cửa sổ.

câu hỏi của bạn:

Là trung bình cho đến khi cửa sổ modal là lên presentingViewController.view (self.view trong trường hợp nêu trên) được lấy ra từ các Xem hệ thống phân cấp và presentedViewController.view (myVC.view trong trường hợp trên) được thêm vào UIWindow?

Nếu bộ điều khiển ở chế độ toàn màn hình thì xác nhận quyền sở hữu này là đúng. Nếu không, bộ điều khiển xem trình bày vẫn ở đó nhưng toàn bộ nội dung bị chồng chéo bởi các khung nhìn khác (ngay cả khi chúng là nửa trong suốt). Ngoài ra, luôn có một số khung nhìn giữa khung nhìn trình bày và bộ điều khiển trình bày.

Điều gì sẽ xảy ra nếu myVC.modalPresentationStyle! = UIModalPresentationFullScreen?

Xem câu trả lời cho câu hỏi trước - trên iPhone, sẽ không có sự khác biệt.

iOS cũng có xóa tất cả các chế độ xem từ UIWindow ngoại trừ presentationViewController.view cho đến khi hộp thoại toàn màn hình có tối ưu hóa không? Nếu KHÔNG tại sao không?

Từ các thử nghiệm của tôi, chỉ bộ điều khiển trình bày được loại bỏ khỏi hệ thống phân cấp cửa sổ. Đây có lẽ là để tối ưu hóa hiệu suất vẽ. Đây là bộ điều khiển duy nhất mà hệ thống có thể xóa an toàn. Việc xóa bất kỳ chế độ xem nào khác có thể gây ra sự cố (ví dụ: các chế độ xem phải luôn hiển thị).

Edit: Nếu bạn muốn thực hiện một bộ điều khiển trong suốt, bạn có thể:

  1. Thêm xem trực tiếp đến hệ thống phân cấp tầm nhìn của bạn (hoặc để quan điểm của bộ điều khiển hoặc tới cửa sổ) với một hình ảnh động chuyển tiếp (+[UIView transition...])
  2. Tương tự nhưng cũng thêm bộ điều khiển con vào bộ điều khiển của bạn.
+2

Câu trả lời này có phần không chính xác. Khi một bộ điều khiển toàn màn hình được trình bày, UIKit sẽ loại bỏ các khung nhìn của bộ điều khiển khác khỏi cửa sổ. Trong thực tế, việc bổ sung/loại bỏ từ cửa sổ chính xác là những gì các phương thức '-viewDid/Will (Dis) xuất hiện:' đang báo cáo. Nhưng UIKit thêm chúng trở lại cửa sổ trước khi bạn quay trở lại với chúng. –

+1

@BJHomer Bạn đã đúng. Tôi có hầu hết các thử nghiệm iPad nên tôi đã nhầm lẫn trong các trường hợp iPhone. Đã sửa câu trả lời. – Sulthan

+0

Đây cũng là từ các thử nghiệm của tôi -> "chỉ bộ điều khiển trình bày được loại bỏ khỏi hệ thống phân cấp cửa sổ". Tôi hy vọng iOS không bao giờ có thể xóa tất cả các chế độ xem khác khỏi hệ thống phân cấp cửa sổ. @BJ Homer là sai khi nói rằng "Khi một bộ điều khiển toàn màn hình phương thức được trình bày, UIKit loại bỏ các bộ điều khiển khác xem từ cửa sổ." – msk

Các vấn đề liên quan