Giờ đây, Interface Builder cho phép người dùng thay đổi kích thước động của mọi bộ điều khiển chế độ xem trong bảng phân cảnh, để mô phỏng kích thước của một thiết bị nhất định.
Trước chức năng này, người dùng nên đặt thủ công từng kích thước bộ điều khiển chế độ xem. Vì vậy, bộ điều khiển khung nhìn đã được lưu với một kích thước nhất định, được sử dụng initWithCoder
để thiết lập khung hình ban đầu.
Bây giờ, có vẻ như initWithCoder
không sử dụng kích thước được xác định trong bảng phân cảnh và xác định kích thước 1000x1000 px cho chế độ xem điều khiển và tất cả các chế độ xem phụ của nó.
Đây không phải là vấn đề, bởi vì các khung nhìn luôn phải sử dụng một trong các giải pháp bố cục sau:
autolayout và tất cả các ràng buộc sẽ bố trí chính xác chế độ xem của bạn
autoresizingMask, sẽ bố trí từng chế độ xem không có bất kỳ ràng buộc nào kèm theo ( lưu ý rằng các ràng buộc tự động thanh toán và lề hiện tương thích trong cùng một chế độ xem \ o /! )
Nhưng đây là một vấn đề đối với tất cả nội dung bố cục liên quan đến lớp xem, chẳng hạn như cornerRadius
, không tự động thanh toán hay mặt nạ tự động khôi phục áp dụng cho các thuộc tính của lớp.
Để trả lời vấn đề này, cách phổ biến là sử dụng viewDidLayoutSubviews
nếu bạn đang ở trong bộ điều khiển hoặc layoutSubview
nếu bạn đang ở trong một chế độ xem. Tại thời điểm này (đừng quên gọi cho họsuper
phương thức tương đối ), bạn khá chắc chắn rằng mọi thứ về bố cục đã được thực hiện!
Khá chắc chắn? Hum ... không hoàn toàn, tôi đã nhận xét, và đó là lý do tại sao tôi hỏi câu hỏi này, trong một số trường hợp, khung nhìn vẫn có kích thước 1000x1000 trên phương pháp này. Tôi nghĩ rằng không có câu trả lời cho câu hỏi của riêng tôi. Để cung cấp thông tin tối đa về nó:
1- nó chỉ xảy ra khi đặt ra các ô! Trong UITableViewCell
& UICollectionViewCell
lớp con, layoutSubview
sẽ không được gọi sau khi các lượt xem phụ được sắp xếp chính xác.
2- Như @EugenDimboiu đã nhận xét (vui lòng ủng hộ câu trả lời của anh ấy nếu hữu ích cho bạn), việc kêu gọi [myView layoutIfNeeded]
chế độ xem phụ không bố cục sẽ bố cục chính xác đúng lúc.
- (void)layoutSubviews {
[super layoutSubviews];
NSLog (self.myLabel); // 1000x1000 size
[self.myLabel layoutIfNeeded];
NSLog (self.myLabel); // normal size
}
3- Theo tôi, đây chắc chắn là một lỗi. Tôi đã gửi nó cho radar (id 28562874).
Tái bút: Tôi không phải là người bản xứ Anh, vì vậy hãy thoải mái chỉnh sửa bài đăng của tôi nếu ngữ pháp của tôi cần được sửa;)
PS2: Nếu bạn có giải pháp nào tốt hơn, đừng viết câu trả lời khác. Tôi sẽ chuyển câu trả lời được chấp nhận.