今天寫項目遇到了計算cell高度的問題,然后發(fā)現(xiàn)Autolayout布局的都在用systemLayoutSizeFittingSize來計算cell的高度殊霞,代碼如下:
//用于計算cell的高度
[self.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height
用過之后發(fā)現(xiàn)計算的結(jié)果都是0樊卓,試了很多種方式都是0壁畸,想了一下午終于在看一個網(wǎng)站上找到了答案茅郎,現(xiàn)在我來總結(jié)下:
1.計算結(jié)果為44癣朗,很多人得到的結(jié)果可能為44拾因,那是因為
//這兩個弄混淆了
self.contentView 和 self
//在添加視圖時有人會使用
[self.contentView addSubview:view]; 或者 [self addSubview:view];
我傾向于會使用前者添加,計算時用:
[self.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height
2.systemLayoutSizeFittingSize計算結(jié)果為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的高荣暮。
出現(xiàn)0庭惜,是因為你寫的約束沒有辦法確認cell的高,cell自然也就無法計算出高度穗酥。
同樣我們可以用
[self.contentView layoutIfNeeded];
[self.contentView updateConstraintsIfNeeded];
float height = CGRectGetMaxY(self.siteLabel.frame));
同樣可以獲得cell最底部視圖的最大Y值护赊,從而動態(tài)的調(diào)整cell的高度。