1. 程式人生 > >autolayout 動態計算高度時 UILabel的preferredMaxLayoutWidth設定

autolayout 動態計算高度時 UILabel的preferredMaxLayoutWidth設定

在計算cell的高度時,我們會使用如下方法:

CGSize size = [self.cell.contentView  systemLayoutSizeFittingSize:UILayoutFittingCompressedSize ];

但如果裡面有UILbel ,我們則需要設定UILabel的preferredMaxLayoutWidth。

如果label 的寬度是一定的,可以直接在自定義cell的程式碼裡的

- (void)awakeFromNib {

}

方法裡面填寫,或者直接在xib裡面設定。

但一般UILabel的寬度是不一定的,它會隨著螢幕的變寬而變寬,於是,我們需要在下面的方法裡面設定

-(void)layoutSubviews{

    [super   layoutSubviews];

     [self.contentView   layoutIfNeeded];

    [self.contentView  layoutSubviews];

    self.label.preferredMaxLayoutWidth =self.label.frame.size.width;

}

第二行的 要寫   [self.contentViewlayoutSubviews]   [self.contentView   layoutIfNeeded];的原因; 是因為此layoutSubviews方法是cell 的,而label 是屬於cell.contenView的,所以此時的label的寬度值還是xib上的寬度,並不是真正正確的寬度,所以需要多加上這一行。

最後,其實是最先,在生成self.cell 這個用來計算高度的cell時,採用以下方法

self.cell = [self.tableView dequeueReusableCellWithIdentifier:@"bbTableViewCell"];

self.cell.frame = [UIScreen mainScreen].bounds;

    [self.cell layoutIfNeeded];

要給cell.frame 賦值是因為(其實我也不知道為什麼會這樣,反正實測是這個樣子)tableview還沒有出現在介面的時候,cell的frame也是不對的,他的值還是xib裡面的值,所以需要賦值。

然後layoutIfNeeded 是為了觸發 cell的 layoutsubview方法。

以上都是我個人實測結果,沒有理論依據支援,所以小心點看著用吧。