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
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。