2009-08-31 28 views
15

Tôi có chế độ xem được tải trong MainWindow.xib. Nó chỉ là một cái nhìn với một uiimageview trong đó cho thấy một hình ảnh trên toàn bộ màn hình (320 X 480). Khi tải ứng dụng tôi hiển thị quan điểm này và sau đó tôi làm mộtIPhone - UIView ThêmSubview Gap ở đầu

[self.view addSubview:tabbarController.view]; 

Tab Bar điều khiển chỉ là một UITabBarController với 2 Xem Bộ xử lý thêm vào nó. Khi nó thêm khung nhìn của tabbarController vào subview nó để lại một khoảng trống ở đỉnh khoảng 20px. Ứng dụng của tôi không có thanh trạng thái nhưng đây là cơ bản dành cho người khác. Điều này xảy ra trừ khi tôi thêm điều này vào bộ điều khiển chế độ xem của mình:

self.view.frame = CGRectMake(0, 0, 320, 480); 

Bất kỳ ai cũng có thể giải thích điều này. Tôi đang làm

self.view = tabbarController.view; 

nhưng đã được thông báo rằng tôi không nên làm điều đó. Vì vậy, bây giờ tôi đang thêm một subview, nhưng tôi không hiểu tại sao tôi phải điều chỉnh CGRect của quan điểm của tôi để không hiển thị 20px.

Trả lời

17

UITabBarController dự kiến ​​sẽ thêm chế độ xem làm chế độ xem phụ của UIWindow chứ không phải là chế độ xem phụ của một số UIView khác. Thuộc tính frame định nghĩa offset của view trong superview của nó, vì vậy việc triển khai UITabBarController sẽ thay đổi frame của khung nhìn của nó bằng 20 pixel theo mặc định để lại chỗ cho thanh trạng thái. Bạn đang sử dụng UITabBarController theo cách không chuẩn bằng cách thêm nó vào chế độ xem đã được bù đắp 20 pixel cho thanh trạng thái. UITabBarController bù đắp tầm nhìn của nó thêm 20 pixel tương ứng với superview của nó, gây ra khoảng trống bạn nhìn thấy.

Một cách sạch để sửa lỗi này là thêm quan điểm của UITabBarController như là một subview của cửa sổ thay vì một cái nhìn:

[[[UIApplication sharedApplication] keyWindow] addSubview:tabbarController.view]; 

(Lưu ý: Phương pháp keyWindow sẽ chỉ trả lại cửa sổ của bạn nếu bạn đã gọi Nếu không, bạn có thể muốn đặt thuộc tính cửa sổ trên UIViewController.)

+0

Cảm ơn bạn đã giải thích rõ ràng. Có lẽ tôi nên quay lại và cấu trúc lại một phần ứng dụng của mình. Tôi muốn làm mọi thứ theo đúng cách, nhưng tôi nghĩ tốt hơn là tách logic điều khiển xem khỏi ứng dụng đại biểu - vì vậy trình điều khiển chế độ xem gốc của tôi thực hiện tất cả những gì cần. Điều đó sẽ giải thích lý do tại sao trong bộ điều khiển xem gốc của tôi nếu tôi đã tự.view = tabbarController.view thay vì thêm như một subview, tôi sẽ không nhận được khoảng cách. Câu trả lời chính xác. Tôi sẽ bỏ phiếu nhiều hơn nếu tôi có thể. – Brian

+0

Nghe có vẻ như bản năng của bạn tốt ở đây. Đây chỉ là một trong những hạn chế thiết kế trong Cocoa Touch mà chúng tôi phải làm việc ngay bây giờ. Hãy nhớ rằng bạn không nhất thiết phải thêm tabbarController.view vào cửa sổ của bạn từ đại biểu ứng dụng của bạn. Bạn có thể thêm nó vào bộ điều khiển xem của bạn nếu đó là nơi bạn nghĩ nó có ý nghĩa nhất. Bạn chỉ cần có quyền truy cập vào đối tượng cửa sổ, hoặc thông qua phương thức keyWindow, hoặc bằng cách thiết lập nó như là một thuộc tính trên bộ điều khiển của bạn trở lại trong applicationDidFinishLaunching :. – cduhn

+0

nhưng điều này không có nghĩa là tabbarcontroller.view bây giờ là một subview của window.view? Nhưng không đúng trong trường hợp của tôi, tôi có chế độ xem quảng cáo và sau đó là lần xem nội dung thứ hai. Và tôi đang thêm tabbarcontroller.view vào contentview. Trong thời trang này, viewcontroller sẽ xử lý nội dung/adview tùy thuộc vào quảng cáo. nếu tôi thêm tabbarcontroller.view vào cửa sổ, tôi không nghĩ rằng tôi sẽ có thể xử lý các khung nhìn bằng cách sử dụng viewcontroller của tôi. bạn nghĩ sao? – LolaRun

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