2013-04-10 30 views
14

Có cách nào đơn giản có thể giúp tôi thay đổi vị trí của chế độ xem phụ thuộc theo cách động bằng cách sử dụng kích thước nội dung của chúng không?Kích thước UILabelToFit và các ràng buộc

Tôi muốn hiển thị một số chế độ xem trong cột, tất cả đều có nội dung khác nhau. Và tôi muốn họ được đặt cái khác (tôi đã tạo bố trí sử dụng hạn chế mà trông như thế này)

initial layout

Nhưng mỗi khi tôi thay đổi nội dung của nhãn và gọi sizeToFit, hệ thống dường như bỏ qua bố trí.

after size to fit call

Tại thời điểm tôi chỉ quan tâm đến bất động sản chiều cao, tôi biết rằng hạn chế rect có thể được sử dụng quá và trong quá khứ tôi đã viết nhiều loại trên UIView để thay đổi kích thước động (Tôi đoán tất cả mọi người đã làm) . Nhưng có lẽ có một cách đơn giản mà tôi không biết?

+0

Kiểm tra http://stackoverflow.com/a/16009707/988169 này. Điều này làm việc hoàn toàn tốt đẹp. – pkc456

Trả lời

42

-sizeToFit không nên được gọi nếu bạn đang sử dụng bố cục tự động. Đó là một phần của hệ thống 'cũ'.

Có vẻ như IB đã chèn chiều cao rõ ràng vào các ràng buộc của bạn (các thanh dọc bên cạnh các nhãn cho biết điều này). Hãy thử chọn nhãn và nhấn Cmd + = để xóa các nhãn này.

Đối với nhãn multiline bạn cũng sẽ cần phải làm như sau trong điều khiển điểm của bạn để làm cho mọi thứ hoạt động tốt khi quay/thay đổi kích thước xem:

- (void)updateLabelPreferredMaxLayoutWidthToCurrentWidth:(UILabel *)label 
{ 
    label.preferredMaxLayoutWidth = 
     [label alignmentRectForFrame:label.frame].size.width; 
} 

- (void)viewDidLayoutSubviews 
{ 
    [super viewDidLayoutSubviews]; 

    [self updateLabelPreferredMaxLayoutWidthToCurrentWidth:self.label1]; 
    [self updateLabelPreferredMaxLayoutWidthToCurrentWidth:self.label2]; 
    [self updateLabelPreferredMaxLayoutWidthToCurrentWidth:self.label3]; 

    [self.view layoutSubviews]; 
} 

nhãn Multiline vạch trần một trong những điểm yếu của tự động bố trí. Chúng tôi phải cập nhật preferredMaxLayoutWidth để buộc nhãn phải chỉnh lại và điều chỉnh chiều cao của nó, nếu không, nếu chế độ xem được thay đổi kích thước/xoay, bố cục tự động không nhận ra nhãn cần được chỉnh lại và thay đổi kích thước.

+0

Cảm ơn bạn! Làm việc cho tôi (tôi hoàn toàn bị xóa và tạo chế độ xem mới, xcode dường như lưu trữ một số dữ liệu liên quan đến bố cục một cách rõ ràng) – asdf

+0

Vâng, IB + autolayout có rất nhiều sự cố ngay bây giờ. Hy vọng rằng Apple có thể cải thiện nó trong tương lai. –

+1

Bạn có thể giải thích mã của mình nhiều hơn, đặc biệt là việc sử dụng 'alignmentRectForFrame'. –

-1

Điều này cũng hoạt động. https://github.com/jszumski/auto-layout-table-cells/blob/master/DynamicCellHeights/JSLabel.m

@interface JSLabel : UILabel 

@end 

@implementation JSLabel 

- (id)init { 
    self = [super init]; 

    // required to prevent Auto Layout from compressing the label (by 1 point usually) for certain constraint solutions 
    [self setContentCompressionResistancePriority:UILayoutPriorityRequired 
              forAxis:UILayoutConstraintAxisVertical]; 

    return self; 
} 

- (void)layoutSubviews { 
    [super layoutSubviews]; 

    self.preferredMaxLayoutWidth = CGRectGetWidth(self.bounds); 

    [super layoutSubviews]; 
} 

@end 
2

Nếu bạn vẫn muốn sử dụng Auto Layout Hạn chế cho Label của bạn. Đây là một giải pháp:

[self.lblBadgeValue sizeToFit]; 
self.constraintWidthBadgeLabel.constant = self.lblBadgeValue.frame.size.width; 
[self.lblBadgeValue needsUpdateConstraints]; 
[self.lblBadgeValue layoutIfNeeded]; 
  • Giải thích hơn:
  • sizeToFit -> làm cho nhãn phù hợp với chiều cao, chiều rộng với nội dung của nó.
  • Vì vậy, trong thời gian chạy, bạn cần phải cập nhật chiều cao ràng buộc, hoặc chiều rộng cho nhãn
  • Sau đó bạn cần phải nói cho trình biên dịch biết rằng những gì cần cập nhật ràng buộc.
  • Và cuối cùng, bạn cần gọi bố cục nếu có thay đổi về ràng buộc.
Các vấn đề liên quan