说到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.L3 makeConstraints:^(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。