关于systemLayoutSizeFittingSize为0的问题

今天写项目遇到了计算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的高度。

你可能感兴趣的:(关于systemLayoutSizeFittingSize为0的问题)