2013-03-02 23 views
15

Tôi có một lớp con UIView tùy chỉnh bổ sung một subview programatically trong quá trình khởi tạo. Tôi muốn subview này được chiều rộng tương tự như UIView tùy chỉnh.Cách lấy kích thước của UIView tùy chỉnh được thêm qua bảng phân cảnh trong initWithCoder :?

Mã của tôi hoạt động fine nếu tôi lập trình thêm UIView tùy chỉnh. Tuy nhiên, khi UIView được khởi tạo qua StoryBoard, tôi không thể có được chiều rộng của UIView tùy chỉnh.

// Init programatically 
- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     NSLog (@"view: %f", self.frame.size.width); //WILL return width 
     NSLog (@"view: %f", self.bounds.size.width); //WILL return width 
    } 
    return self; 
} 

// Init from storyboard 
- (id)initWithCoder:(NSCoder *)aDecoder { 
    self = [super initWithCoder:aDecoder]; 
    if (self) { 

     NSLog (@"view: %f", self.frame.size.width); //Returns 0 
     NSLog (@"view: %f", self.bounds.size.width); //Returns 0 
    } 
    return self; 
} 

Khi initWithCoder: được điều hành bởi kịch bản, khung vọt của UIView đều trở như 0. Có cách nào tiếp cận kích thước của UIView trong initWithCoder ?? Hoặc, ít nhất là truy cập vào các kích thước trước khi drawRect: được gọi?

Cảm ơn.

Trả lời

13

Thay vì thiết lập kích thước subviews trong hàm init, thiết lập nó liên quan đến các giao diện tùy chỉnh trong phương pháp layoutSubviews của giao diện tùy chỉnh. Làm điều đó ở đây sẽ có nghĩa là chiều rộng của chế độ xem con cũng sẽ luôn thay đổi để khớp với chiều rộng của chế độ xem tùy chỉnh ngay cả khi bạn thay đổi kích thước của chế độ xem tùy chỉnh tại bất kỳ thời điểm nào sau khi khởi tạo.

+0

Aaaah. Cảm ơn bạn! Khi thử nghiệm bạn thực sự đúng. layoutSubviews: có kích thước có sẵn và được gọi trước drawRect:! Chỉ cần những gì tôi đang tìm kiếm. –

+4

Để thêm giải thích thêm một chút, nếu bạn đang sử dụng Autolayout (mà tôi nghĩ bạn) thì các giới hạn của khung nhìn của trình điều khiển xem và các phần phụ của nó không khả dụng cho đến khi bố cục diễn ra - 'viewDidLayoutSubviews' được gọi trên khung nhìn của bạn điều khiển sau khi điều này đã xảy ra. – jrturton

+0

Cảm ơn bạn đã trợ giúp :) –

2

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

- (id)initWithCoder:(NSCoder *)aDecoder 
{ 
    self = [super initWithCoder:aDecoder]; 
    if (self) { 

     [self initWithFrame:[self frame]]; 

     NSLog (@"view: %f", self.frame.size.width); 
     NSLog (@"view: %f", self.bounds.size.width); 
    } 
    return self; 
} 
+0

tốt trong UIViewController, nhưng không có trong lớp con UIView tùy chỉnh. 'self' đã là 'view' - nghĩa là không có thuộc tính 'view' cho 'self' trong UIView. –

+0

@ SoOverIt- kiểm tra chỉnh sửa của tôi – iPatel

+0

bằng cách sử dụng mã đã chỉnh sửa của bạn, tôi nhận được lỗi trình biên dịch 'Kết quả của cuộc gọi init ủy nhiệm phải được trả về ngay hoặc được gán cho 'self''. –

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