UITableViewAutomaticDimension U
2020-08-11 本文已影响0人
MQ_Twist
一板一眼,就会滋生弱点。
前言
众所周知,在tableView里面的数据不多时,用UITableViewAutomaticDimension + autolayout进行自适应cell高度是一件哇塞的事儿,笔者这种情况都是这么做的,常在河边走,哪有不湿脚,这不问题来了。
问题
单行显示正常,2行cell高度有变化,但是还是显示单行,3行cell高度又高点,但只能显示2行,剩下的...,
目前出现的问题有,iPhone xs max,5s,其他机型暂时没有问题。
代码
- 代理方法
- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath {
//预设高度,宏自己的
return WIDTH_FOR_IPAD(100);
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
return UITableViewAutomaticDimension;
}
看着挺安逸。
- cell约束重要代码
CGFloat margin = WIDTH_FOR_IPAD(5);
[self.descLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(margin);
make.left.equalTo(self.dotView.mas_right).offset(WIDTH_FOR_IPAD(7));
make.right.equalTo(-margin);
make.bottom.equalTo(-margin));
}];
上左下右也都有,label
的numberOfLines
设置是0,看着还行没毛病哈,但就是有问题。开始我想的是机型或者是系统问题,后来。。。
- 不多哔哔,先上解决方法
CGFloat margin = WIDTH_FOR_IPAD(5);
[self.descLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(margin);
make.left.equalTo(self.dotView.mas_right).offset(WIDTH_FOR_IPAD(7));
make.right.equalTo(-margin);
//重点在这
make.bottom.equalTo(-ceilf(margin));
}];
原因是,底部约束在经过宏计算之后出现了小数。初步猜测,在有小数的时候会出现精度丢失,最终自适应高度出现问题。
总结
有关小数导致出现适配有问题的情况之前我也遇到过,不过大多是有关collectionView的,item有的机型显示就是奇奇怪怪,后来对间距向下取整
就解决问题了,没想到tableViewCell上也会有这种问题。
在寻找上面的原因的时候,也找到几个label不会换行的解决办法,比如:
- (void)layoutSubviews {
[super layoutSubviews];
self.descLabel.preferredMaxLayoutWidth = self.descLabel.bounds.size.width;
}
后记
平时技术不咋滴,写bug倒是一流,不过找到问题的所在并解决还是很开心的,通往大神这条路还有很长啊~