Nguồn: http://www.objc.io/su-3/advified-auto-layout-toolbox.html
Kích thước nội dung nội tại của văn bản nhiều dòng
Kích thước nội dung nội tại của UILabel và NSTextField không rõ ràng đối với văn bản nhiều dòng. Chiều cao của văn bản phụ thuộc vào chiều rộng của các dòng, vẫn chưa được xác định khi giải quyết các ràng buộc. Để giải quyết vấn đề này, cả hai lớp đều có một thuộc tính mới gọi là preferMaxLayoutWidth, chỉ định độ rộng dòng tối đa để tính kích thước nội dung bên trong.
Vì chúng ta thường không biết trước giá trị này, chúng ta cần thực hiện một cách tiếp cận hai bước để có được quyền này. Đầu tiên chúng ta để Auto Layout thực hiện công việc của mình và sau đó chúng ta sử dụng khung kết quả trong pass layout để cập nhật lại chiều rộng tối đa ưa thích và bố trí kích hoạt lại.
- (void)layoutSubviews
{
[super layoutSubviews];
myLabel.preferredMaxLayoutWidth = myLabel.frame.size.width;
[super layoutSubviews];
}
Cuộc gọi đầu tiên đến [super layoutSubview] là cần thiết để nhãn có được bộ khung của nó, trong khi cuộc gọi thứ hai là cần thiết để cập nhật bố cục sau khi thay đổi. Nếu chúng tôi bỏ qua cuộc gọi thứ hai, chúng tôi sẽ gặp lỗi NSIternalInconsistencyException, vì chúng tôi đã thực hiện các thay đổi trong đường dẫn bố cục yêu cầu cập nhật các ràng buộc, nhưng chúng tôi đã không kích hoạt lại bố cục.
Chúng ta cũng có thể làm điều này trong một lớp con nhãn chính nó:
@implementation MyLabel
- (void)layoutSubviews
{
self.preferredMaxLayoutWidth = self.frame.size.width;
[super layoutSubviews];
}
@end
Trong trường hợp này, trước tiên chúng ta không cần gọi [super layoutSubview], vì khi layoutSubview được gọi, chúng ta đã có một khung trên chính nhãn đó.
Để thực hiện điều chỉnh này từ cấp độ của trình điều khiển chế độ xem, chúng tôi nối vào viewDidLayoutSubview. Tại thời điểm này, các khung của vượt qua Bố cục tự động đầu tiên đã được đặt và chúng ta có thể sử dụng chúng để đặt chiều rộng tối đa ưa thích.
- (void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];
myLabel.preferredMaxLayoutWidth = myLabel.frame.size.width;
[self.view layoutIfNeeded];
}
Cuối cùng, hãy đảm bảo rằng bạn không có ràng buộc về chiều cao rõ ràng trên nhãn có mức ưu tiên cao hơn mức ưu tiên kháng nén nội dung của nhãn. Nếu không, nó sẽ thổi phồng chiều cao tính toán của nội dung. Đảm bảo kiểm tra tất cả các ràng buộc có thể ảnh hưởng đến chiều cao của nhãn.