autolayout 动态计算高度时 UILabel的preferredMaxLayoutWidth设置

在计算cell的高度时,我们会使用如下方法:

    CGSize size = [self.cell.contentView  systemLayoutSizeFittingSize:UILayoutFittingCompressedSize ];

但如果里面有UILbel ,我们则需要设置UILabel的preferredMaxLayoutWidth。

如果label 的宽度是一定的,可以直接在自定义cell的代码里的

- (void)awakeFromNib {

}

方法里面填写,或者直接在xib里面设置。



但一般UILabel的宽度是不一定的,它会随着屏幕的变宽而变宽,于是,我们需要在下面的方法里面设置

-(void)layoutSubviews{

    [super   layoutSubviews];

     [self.contentView   layoutIfNeeded];

    [self.contentView  layoutSubviews];

    self.label.preferredMaxLayoutWidth =self.label.frame.size.width;

}

第二行的  要写   [ self.contentView layoutSubviews ]   [self.contentView   layoutIfNeeded];的原因; 是因为此layoutSubviews方法是cell 的,而label 是属于cell.contenView的,所以此时的label的宽度值还是xib上的宽度,并不是真正正确的宽度,所以需要多加上这一行。


最后,其实是最先,在生成self.cell 这个用来计算高度的cell时,采用以下方法

 self.cell = [self.tableView dequeueReusableCellWithIdentifier:@"bbTableViewCell"];

    self.cell.frame = [UIScreen mainScreen].bounds;

    [self.cell layoutIfNeeded];

要给cell.frame 赋值是因为(其实我也不知道为什么会这样,反正实测是这个样子)tableview还没有出现在界面的时候,cell的frame也是不对的,他的值还是xib里面的值,所以需要赋值。

然后layoutIfNeeded 是为了触发 cell的 layoutsubview方法。



以上都是我个人实测结果,没有理论依据支持,所以小心点看着用吧。

你可能感兴趣的:(OC,语言)