今天写项目遇到了计算cell高度的问题,然后发现Autolayout布局的都在用systemLayoutSizeFittingSize来计算cell的高度,代码如下:
//用于计算cell的高度
[self.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height
用过之后发现计算的结果都是0,试了很多种方式都是0,想了一下午终于在看一个网站上找到了答案,现在我来总结下:
1.计算结果为44,很多人得到的结果可能为44,那是因为
//这两个弄混淆了
self.contentView 和 self
//在添加视图时有人会使用
[self.contentView addSubview:view]; 或者 [self addSubview:view];
我倾向于会使用前者添加,计算时用:
[self.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height
2.systemLayoutSizeFittingSize计算结果为0.
直接上代码:
错误的写法:
//注明:cell底部的视图约束
self.siteLabel = [[UILabel alloc]init];
[self.contentView addSubview:self.siteLabel];
[self.siteLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.siteIcon.mas_right).offset(AUTOSCALE_W(10));
make.right.equalTo(self.mas_right).offset(AUTOSCALE_W(12));
make.centerY.equalTo(self.siteIcon);
make.height.offset(20);
}];
改为:
self.siteLabel = [[UILabel alloc]init];
[self.contentView addSubview:self.siteLabel];
[self.siteLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.siteIcon.mas_right).offset(AUTOSCALE_W(10));
make.right.equalTo(self.mas_right).offset(AUTOSCALE_W(12));
make.centerY.equalTo(self.siteIcon);
make.bottom.equalTo(0);
}];
原因很简单,你在写约束的时候只想去控制视图位置,忽略了,你写的约束是否能够确定cell的高。
出现0,是因为你写的约束没有办法确认cell的高,cell自然也就无法计算出高度。
同样我们可以用
[self.contentView layoutIfNeeded];
[self.contentView updateConstraintsIfNeeded];
float height = CGRectGetMaxY(self.siteLabel.frame));
同样可以获得cell最底部视图的最大Y值,从而动态的调整cell的高度。