2009-02-13 32 views
17

gì đối tượng có trách nhiệm dipatching các cuộc gọi phương pháp UIViewController luân chuyển, tức là:UIViewController xoay phương pháp

  • shouldAutorotateToInterfaceOrientation:
  • willRotateToInterfaceOrientation:duration:
  • willAnimateFirstHalfOfRotationToInterfaceOrientation:duration:
  • willAnimateSecondHalfOfRotationFromInterfaceOrientation:duration:
  • didRotateFromInterfaceOrientation:

Tôi tưởng tượng nó là UIApplication (nhưng có thể là AppDelegate hoặc UIWindow).

Câu hỏi tiếp theo là cách đối tượng biết được UIViewController để nói chuyện với ai?

Làm cách nào để biết được UIViewController nào có chế độ xem làm chế độ xem phụ của cửa sổ?

Có thư nào bạn có thể gửi hoặc thuộc tính bạn có thể đặt (của một số đối tượng) đặt "Hoạt động" UIViewController cho ứng dụng không?

+0

Câu hỏi hay, tôi đã nghi ngờ điều này trong tâm trí của mình kể từ ngày. Đã sắp hỏi một câu hỏi tương tự và gặp phải vấn đề này! –

+0

Tôi nên hỏi câu hỏi của tôi như bạn đã làm. Đây là tất cả các câu hỏi liên quan đến phổ quát, "khung tùy chỉnh, đọc tài liệu, ok bây giờ làm thế nào tôi phải biết làm thế nào nó tất cả nên làm việc". –

Trả lời

13

Dường như UIApplication đang gửi tin nhắn đến bộ điều khiển chế độ xem đang kích hoạt.

Nhưng thể hiện của Trình điều khiển chế độ xem của bạn nhận được những thông báo này như thế nào?

Thư được chuyển tiếp đến bộ điều khiển chế độ xem đầu tiên có chế độ xem đã được thêm vào ví dụ UIWindow.

này nắm tới 3 kịch bản cơ bản:

  1. Các ViewController mà xem là thêm trực tiếp vào trường hợp UIWindow (đơn xem ứng dụng)

  2. Controller chuyển hướng trong một Navigation dựa ứng dụng, sau đó điều khiển điều hướng chuyển tiếp thông báo tới chế độ xem đang kích hoạt bộ điều khiển.

  3. Controller thanh tab trong một ứng dụng thanh tab dựa, sau đó tab thanh điều khiển chuyển tiếp thông điệp tới quan điểm tích cực xem điều khiển (hoặc bộ điều khiển chuyển hướng tích cực).

Vấn đề bạn sẽ có, là nếu bạn tạo ứng dụng có nhiều chế độ xem nhưng KHÔNG sử dụng bộ điều khiển Điều hướng hoặc Thanh điều khiển Tab. Nếu bạn trao đổi lượt xem trong và ngoài của cá thể UIWindow theo cách thủ công, bạn sẽ không nhận được những thư này một cách đáng tin cậy. Điều này tương tự như các bài đăng như thế này: iPhone viewWillAppear not firing

Chỉ cần sử dụng quy ước của Apple cho nhiều lượt xem và bạn vẫn ổn. Hy vọng điều này sẽ tiết kiệm một số một giờ hoặc một hai

+0

Mặc dù vậy, một điều đáng ngờ là bộ điều khiển thanh điều khiển/tab điều hướng có chuyển các thông điệp đến các bộ điều khiển của subView hay đúng hơn là chúng chỉ thay đổi kích thước các khung nhìn? Tôi nghĩ rằng họ chỉ thay đổi kích thước các bản xem trước của họ, bộ điều khiển chế độ xem đầu tiên không chuyển thông báo xuống phân cấp chế độ xem, chúng chỉ thay đổi kích thước các bản xem trước của họ. –

+0

chính xác, Apple đề xuất chỉ sử dụng một VC cho mỗi màn hình. Vì vậy, việc sử dụng bộ điều khiển chế độ xem "phụ" không được hỗ trợ và các tin nhắn không tự động được chuyển tiếp. –

+0

Corey, làm thế nào có thể giới hạn mình vào một VC mỗi màn hình, ví dụ bạn có một ứng dụng cần hai lượt xem bảng trên cùng một màn hình? Bạn sẽ cần một VC cho mỗi cái nhìn bảng, sau đó một VC để quản lý cả hai. Hoặc xem xét một ví dụ khác: một ứng dụng cần thanh tab như hành vi nhưng đối với các yêu cầu về đồ họa/nghệ thuật thì cần có một bộ điều khiển thanh tab tùy chỉnh? Chỉ có một VC trên mỗi màn hình có vẻ là một mục tiêu không khả thi đối với các UI phức tạp. Trong những trường hợp này, phải có cách * một số * để kiểm soát đáng tin cậy các sự kiện xoay vòng giao diện? – Yetanotherjosh

4

Đây là tất cả những điều bạn không bao giờ lo lắng. Chỉ cần thêm chế độ xem gốc của trình điều khiển của bạn vào cửa sổ - hoặc nhận thanh tab hoặc bộ điều khiển điều hướng để làm điều đó cho bạn - và nó sẽ nhận được các thông báo này.

(Nhưng nếu bạn poke xung quanh với trình gỡ lỗi, bạn có thể đến cùng một kết luận tôi có: có một số loại bảng nội bộ ánh xạ mỗi lần xem bộ điều khiển trở lại bộ điều khiển, và các tin nhắn được gửi dựa trên liên kết đó.)


cập nhật: Đây là kỳ diệu thực sự tin vào năm 2009 khi lần đầu tiên tôi đã viết câu trả lời này, nhưng sự thay đổi về iOS đã thực hiện các API đằng sau nó công cộng. Bộ điều khiển chế độ xem gốc hiện có thể truy cập thông qua thuộc tính UIWindow.rootViewController và cây bộ điều khiển chế độ xem hậu duệ được tạo thành bằng thuộc tính UIViewController.childViewControllers.

Bộ điều khiển chế độ xem của phụ huynh có trách nhiệm thông báo cho con mình về những thay đổi định hướng. (Tôi không chắc chắn như thế nào bộ điều khiển xem gốc được thông báo, nhưng bạn có thể thiết lập một breakpoint và tìm ra chính mình.) Phương pháp -shouldAutomaticallyForwardRotationMethods quyết định xem UIViewController sẽ làm điều này cho bạn. Nếu trả về NO, bạn có trách nhiệm thực hiện điều đó trong các phương thức -willRotateToInterfaceOrientation:duration:, -willAnimateRotationToInterfaceOrientation:duration:-didRotateFromInterfaceOrientation: của mình.

+0

Nó thực sự là ma thuật, +1. Bộ điều khiển chế độ xem gốc được xoay và thay đổi kích thước và các khung hình của các bản xem lại được thay đổi và thay đổi kích thước dựa trên các mặt nạ tự động hóa. Không biết tại sao mọi người lại bỏ phiếu cho anh chàng tội nghiệp này! –

+0

+1, tôi không thấy lý do gì để bỏ phiếu cho câu trả lời này. Đó là một sự xấu hổ mà mọi người không nói lý do tại sao họ xuống bỏ phiếu một câu trả lời. –

+0

Đã bỏ phiếu cho các lý do được đề cập ở trên. –

4

Làm cách nào để biết UIViewController nào có chế độ xem làm chế độ xem phụ của cửa sổ?

Lớp UIViewController duy trì một bản đồ tĩnh giữa các chế độ xem và bộ điều khiển chế độ xem của chúng. Bản đồ này được truy vấn ở một vài địa điểm chính bên trong CocoaTouch. Đặc biệt, [UIView nextResponder] truy vấn nó và trả về bộ điều khiển nếu tìm thấy.

Tôi đoán UIWindow thực hiện tìm kiếm tương tự với chế độ xem gốc để biết bộ điều khiển nào sẽ chuyển tiếp các sự kiện xoay tới. Sẽ kiểm tra lần sau tôi sẽ tìm kiếm thứ gì đó trong quá trình tháo gỡ. (Tôi đã dành một số thời gian kỹ thuật đảo ngược CocoaTouch để hiểu làm thế nào những thứ làm việc ở đó.)

1

Tôi có một vấn đề tương tự.

Tôi có một trò chơi hoạt động theo hướng ngang (cả khung cảnh bên trái và bên phải).

Để quản lý ứng dụng nhiều chế độ xem, tôi sử dụng UIviewController gốc, tức là một UIViewcontroller giả với giao diện người dùng không có gì. Sau đó, tôi thêm mọi UIview khác vào nó dưới dạng một chế độ xem phụ.

Khi khởi động ứng dụng, trình mô phỏng nhanh chóng quay sang hướng dọc và tôi nhận được mỗi chế độ xem với thuộc tính khung hình của nó trông giống như (0, -80,320,480). Điều này dẫn đến quan điểm bị cắt bớt bởi một hình chữ nhật 160 X 320 ở phía bên phải.

Tôi đã nhận thấy rằng phương thức - shouldAutorotateToInterfaceOrientation: của mỗi chế độ xem phụ chỉ được gọi một lần và điều đó xảy ra khi được thêm vào chế độ xem gốc. Sau đó, khi xoay thiết bị, chỉ chế độ xem gốc mới được gọi là phương thức.

Không có gì đáng ngạc nhiên khi một cuộc gọi phương thức * willAnimate * chỉ được gửi đến chế độ xem gốc, vì vậy, việc xác định bất kỳ phương pháp nào trong các phương pháp này là vô nghĩa.

Những phương pháp này được gọi mỗi khi định hướng được thay đổi thành định hướng được chấp nhận bởi phương thức - shouldAutorotateToInterfaceOrientation:. vì vậy tôi figured tôi có thể chnage của tôi subviews 'khung tài sản từ đó.

Để thực hiện điều này, tôi đã xác định phương pháp sau đây trong lớp rootViewController tôi:

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration 
{ 
    subview1_ViewController.view.frame = CGRectMake(0,0,480,320); 
    subview2_ViewController.view.frame = CGRectMake(0,0,480,320); 
     ... 
} 

Tôi không hiểu tại sao sở hữu khung không được cập nhật, nhưng tôi biết cách giải quyết này hoạt động.

Hy vọng điều này sẽ giúp ...

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