2010-01-10 27 views
48

Tôi có một ứng dụng với một UITabController và mỗi tab là UINavigationController. Gốc của một trong số UINavigationControllers của tôi là UIViewController.Đặt và định kích thước của các bản phụ trong một UIViewController

Bên trong quan điểm cho rằng quan điểm điều khiển, tôi muốn bố trí một số subviews, nhưng tôi bối rối như đến nơi & làm thế nào để đặt chúng ra trong một cách mà sẽ có độ phân giải độc lập (tức là không hardcode các giá trị như 320px, 480, 44px, v.v.)

Khi chế độ xem được tải đầy đủ và hiển thị trên iPhone dọc, chiều cao của nó sẽ là 367px = 480 - 20 (thanh trạng thái) - 44 (thanh điều hướng) - 49 (thanh tab).

Bên trong trình điều khiển chế độ xem, tôi hiện đang tạo tất cả các bản xem trước của mình trong phương thức viewDidLoad. Tuy nhiên, có vẻ như trong phương thức này, chiều cao hiện tại của khung nhìn là 460px (self.view.bounds.size.height). Vì vậy, khi thiết lập các bản xem trước của tôi, tôi không thể tính toán đúng kích cỡ của bất kỳ thứ gì.

Trong phương pháp viewWillAppear:, quan điểm không biết đó là kích thước phù hợp, nhưng điều đó có nghĩa là thiết & tính khung của subview mỗi lần xem sẽ xuất hiện (ví dụ như thay đổi tab hoặc popping khỏi tầm nhìn con điều khiển trên menu ngăn xếp.

là cách duy nhất để làm điều này đúng cách để bố trí trong viewWillAppear:?

tôi đã cố gắng sử dụng các thuộc tính autoresizing (mẹ của autoresizesSubviews & autoresizingMask) nhưng họ dường như không làm việc ở tất cả !? Do những chỉ có hiệu lực sau khi xem là tất cả các thiết lập và sau đó nó được thay đổi kích cỡ (bằng tay/định hướng thay đổi?).

Tôi rất biết ơn nếu ai đó có thể cho tôi biết tại sao tính năng tự động không hoạt động, và cách tốt nhất để loại bỏ mọi thứ bằng cách không mã hóa bất kỳ kích thước nào.

Trả lời

32

autoresizesSubviews nên được đặt trên chế độ xem gốc của bạn, trong khi autoresizingMask phải được đặt trên chế độ xem con - đây là lỗi do tôi tạo ra để bạn có thể.

Trong loadView bạn nên kích thước các bản xem trước của bạn để phù hợp với kích thước của chế độ xem gốc vào lúc này và sau đó khi chế độ xem cha mẹ được thay đổi kích thước từ 460 đến 367 pixel, lượt xem phụ của bạn cũng sẽ được thay đổi kích thước cài đặt mặt nạ ở trên.

Nếu không thành công, sẽ không có gì sai khi đặt kích thước khung trong phạm vi viewWillAppear - tác động hiệu suất của việc thực hiện nó mỗi lần là không đáng kể.

Nếu không có gì khác hoạt động, luôn có layoutSubviews: - ở đó bạn có thể thực hiện bố cục thủ công nếu cần, nó được gọi khi hệ thống tin rằng bố cục có thể phải thay đổi. đó cũng là setNeedsLayout: mà đôi khi tôi gọi từ viewWillRotate:/viewDidRotate: vv Nhưng thực sự điều này không cần thiết và tự động hóa phải đủ tốt.

CHỈNH SỬA: Có, để triển khai logic bố cục tùy chỉnh trong layoutSubviews như tôi đã đề cập ở trên, bạn cần phải phân loại UIView.

+2

Làm rõ nhanh, UIViewController không có, cũng không gọi layoutSubviews. Đây là một phương pháp trên UIView. Tuy nhiên, bạn có thể tạo một phương thức có tên layoutSubviews và gọi phương thức đó từ viewWillAppear: – casademora

+1

Không có "loadViews". Tôi nghĩ rằng bạn có nghĩa là "viewDidLoad", trong trường hợp đó nó đáng nói đến để phát hành những quan điểm trong viewDidUnload là tốt. – DougW

+0

Có một phương thức loadView nhưng viewDidLoad thường là nơi thuận lợi nhất để thêm subviews –

40

Bạn có thể làm logic bố cục của mình bên trong viewWillLayoutSubviews của số UIViewController.

-(void)viewWillLayoutSubviews{ 
    [super viewWillLayoutSubviews]; 
    // Your layout logic here 
} 

DOC: Được gọi ngay trước bố cục chế độ xem của trình điều khiển xemPhương pháp xem trước được gọi. Các lớp con có thể triển khai khi cần thiết. Mặc định là một nop.

+2

bất kỳ sự khác biệt nào nếu tôi sử dụng viewDidLayoutSubviews thay thế? –

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