昨天晚上被自动布局里自定义行高磨了一晚上,简直快要疯掉。我是利用Masonry来进行自动布局的,布局很简单,就是cell里面放两个label,可是,在我添加完约束之后,控制台就会打印一大堆东西,约束是这样的:
_titleLab.font = [UIFont systemFontOfSize:28*TTScreenWith/640];
[_titleLab mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerY.mas_equalTo(self.contentView.mas_centerY);
make.left.equalTo(self.contentView.mas_left).with.offset(15);
make.top.equalTo(self.contentView.mas_top).with.offset(15);
make.bottom.equalTo(self.contentView.mas_bottom).with.offset(-15);
make.right.equalTo(self.infoLab.mas_left).with.offset(-15);
}];
_infoLab.numberOfLines = 0;
_infoLab.lineBreakMode = NSLineBreakByCharWrapping;
_infoLab.font = [UIFont systemFontOfSize:24*TTScreenWith/640];
[_infoLab mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerY.mas_equalTo(self.contentView.mas_centerY);
make.left.equalTo(self.titleLab.mas_right).with.offset(15);
make.top.equalTo(self.contentView.mas_top).with.offset(15);
make.bottom.equalTo(self.contentView.mas_bottom).with.offset(-15);
make.right.equalTo(self.contentView.mas_right).with.offset(-15);
}];
如上约束,在不动态增加高度的情况下是完全没有问题的,而我使用了动态增加行高的方法之后问题就来了。想来想去,回头看看我加的约束,中心为cell的中心,距离上边距15,下边距15,但此时tableview的代理方法里面heightForRow写着
[cell setNeedsUpdateConstraints];
[cell updateConstraintsIfNeeded];
cell.bounds = CGRectMake(0.0f, 0.0f, CGRectGetWidth(tableView.bounds), CGRectGetHeight(cell.bounds));
[cell setNeedsLayout];
[cell layoutIfNeeded];
CGFloat height = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height + 1;
return height;
此时先执行cell里面的约束,在没有对cell进行赋值的情况下height是为1的,好吧,此时它们俩冲突了,最后想来想去,解决办法就是给tableview一个预估的高度,这样保证了约束不与行高冲突.我给的预估高度是
[UIScreen mainScreen].bounds.size.width*60/320
成功~~~~~