1. 程式人生 > >iOS開發masonry動態佈局cell高度

iOS開發masonry動態佈局cell高度

說到iOS自動佈局,有很多的解決辦法。有的人使用xib/storyboard自動佈局,也有人使用frame來適配。對於前者,筆者並不喜歡,也不支援。對於後者,更是麻煩,到處計算高度、寬度等,千萬大量程式碼的冗餘,對維護和開發的效率都很低。

筆者在這裡介紹純程式碼自動佈局的第三方庫:Masonry。這個庫使用率相當高,在全世界都有大量的開發者在使用,其star數量也是相當高的。

本文Cell內容通過Masonry自動佈局並且cell巧妙利用自動佈局計算cell動態高度

實現思路:例如cell中有 label1,label2,label3。

1、為label1新增約束 (以cell.contentView為基準)

    CGFloat one_W = SCREENWIDTH/2;

    [self.L1makeConstraints:^(MASConstraintMaker *make) {

        make.left.mas_equalTo(16);

        make.top.mas_equalTo (10);

        make.width.mas_lessThanOrEqualTo(one_W);e_W);

}];

2、為label2新增約束 使其在label1下方距離為5處 (以label1為基準)。

    [self.L2makeConstraints

:^(MASConstraintMaker *make) {

        make.left.equalTo(wself.L1.mas_left);

        make.top.equalTo(wself.L1.mas_bottom).offset(5);

        make.width.mas_lessThanOrEqualTo(one_W);

    }];

3、為label3新增約束 使其在label2 下方距離為5處 (以label2為基準,重點在於這個一定要在label3 新增一個距離cell。contentView底部的約束)。以上完成cell 子檢視的約束。

    [self.L3makeConstraints:^(MASConstraintMaker *make) {

        make.left.equalTo(wself.L1.mas_left);

        make.top.equalTo(wself.L2.mas_bottom).offset(5);

        make.width.mas_lessThanOrEqualTo(SCREENWIDTH-32);

        make.bottom.equalTo(wself.contentView.mas_bottom).offset(-10);

    }];


4、在tableView heightForRowAtIndexPath 代理中使用一個單獨的不顯示在螢幕的cell 作為計算cell高度使用,通過下面程式碼獲取cell高度:

    customCell *cell= [customCellshareInstance];  

//返回cell之前重新重新整理約束,重新計算高度

    [cell setNeedsUpdateConstraints];

    [cell updateConstraintsIfNeeded];

    [cell setCellContent:self.data[indexPath.row]];

    [cell setNeedsLayout];

    [cell layoutIfNeeded];

CGFloat height = [cell.contentViewsystemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;

return height;


本文demo