2010-07-28 28 views
12

Tôi có một lớp con của UIView cần tính toán chiều cao của nó theo chiều rộng của nó. Khi được tạo trong mã, mọi thứ đều hoạt động. Tuy nhiên, khi tôi cố tạo khung nhìn trong Trình xây dựng giao diện và mặc dù tôi ghi đè tất cả các phương thức liên quan, tôi không thể lấy kích thước của khung nhìn trong trình tạo giao diện.Tải một lớp con UIView từ các vấn đề kích thước NIB

- (id)initWithCoder:(NSCoder *)aDecoder 
{ 
    NSLog(@"init with coder before super width %d",super.frame.size.width); // returns 0 
    self = [super initWithCoder:aDecoder]; 
    NSLog(@"init with coder after super width %d",super.frame.size.width); // still returns 0 
} 

- (void) awakeFromNib 
{ 
     NSLog(@"width of view %d",super.frame.size.width); // Returns 0 as well 
} 

- (void) setFrame:(CGRect)aFrame 
{ 
    [super setFrame:aFrame]; // Called from initWithCoder by super. Correct frame size. 
} 

Vì vậy, dự đoán tiếp theo của tôi là có lẽ giám sát của chế độ xem của tôi đang đặt khung nhìn của tôi sau awakeFromNib. Vâng nó quay ra nó không. Tôi đã ghi đè setFrame trên chế độ xem của mình và được gọi trong initWithCoder.

Vì vậy, đây là những gì tôi biết cho đến nay:

  1. Đầu tiên initWithCoder được gọi
  2. Trong initWithCoder một cuộc gọi đến setFrame: (CGRect) aFrame được gửi
  3. trong setFrame kích thước của khung là chính xác, và tôi gọi [siêu setFrame: aFrame]
  4. awakeFromNib được gọi
  5. super.frame.size.width = 0 trong awakeFromNib self.frame.size.width cũng được 0
  6. Khi quá trình được thực hiện, có vẻ như chế độ xem là một vài pixel bên dưới, nơi nó giả sử, nhưng tôi đoán mã của tôi trở nên quá lớn với kích thước mà nó có thể là thứ tôi làm.

Bất kỳ trợ giúp sẽ được đánh giá cao

+0

Câu hỏi đặt ra thực sự là hoàn toàn sai bởi bây giờ. Tôi đăng một câu trả lời bản thân mình đã bị xóa vì lý do nào đó. Sai lầm chính của tôi là sử dụng% d để in kích thước khung hình khi nó là một phao. Điều đó hoàn toàn ném tôi đi. Câu trả lời của bạn không thực sự làm bất cứ điều gì như xa như tôi có thể thấy rằng tôi đã không làm. –

Trả lời

15

Nếu bạn mở rộng initWithCoder, hãy chắc chắn để gọi phương thức siêu. Trong cuộc gọi siêu này, số điện thoại setFrame sẽ được gọi trên lớp học của bạn.

Sau đó, bạn có thể sử dụng lại cuộc gọi initWithFrame tiêu chuẩn của mình.

tôi luôn luôn làm như sau:

- (id)initWithCoder:(NSCoder *)aDecoder { 
    self = [super initWithCoder:aDecoder]; // Required. setFrame will be called during this method. 
    return [self initWithFrame:[self frame]]; 
} 
+5

Đây có phải là việc khởi tạo điều khiển hai lần không? – Oren

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