Xcode9中TableViewCell高度自适应

​ 前几天升级了Xcode9后,在对一个项目进行调试时突然发现有个使用UITableView的自定义Cell展示异常了,然后控制台报了一大堆的约束警告。

1
2
3
4
"<NSLayoutConstraint:0x60c0000977f0 UIView:0x7fbb8c7841d0.bottom == UILabel:0x7fbb8c7870e0.bottom + 8>",
"<NSLayoutConstraint:0x60c0000979d0 UIView:0x7fbb8c7841d0.top == UITableViewCellContentView:0x7fbb8c781b70.top>",
"<NSLayoutConstraint:0x60c000097a70 UITableViewCellContentView:0x7fbb8c781b70.bottom == UIView:0x7fbb8c7841d0.bottom + 2>",
"<NSLayoutConstraint:0x60c000098bf0 UITableViewCellContentView:0x7fbb8c781b70.height == 44>"

从log上看,觉得应该是tableview的高度设置有问题。于是查看对应 Controller 相关代码。

1
2
3
4
//注册自定义TableViewCell
[self.tableView registerNib:[UINib nibWithNibName:@"GKProjectSearchHeaderFilterView" bundle:nil] forHeaderFooterViewReuseIdentifier:GKProjectSearchHeaderFilterViewIdentifier];
self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
self.tableView.estimatedRowHeight = 60.0f;

rowHeight

代码没有问题,无奈点开UITableView文件进行查看,发现还有个 rowHeight 属性,印象中之前如果使用 estimatedRowHeight 时不设置 rowHeight 也没有影响。考虑到log信息,决定添加上该属性设置

1
self.tableView.rowHeight = UITableViewAutomaticDimension;

界面表现正常!

如果不设置 rowHeight 属性时,实现 UITableViewDelegate 协议的方法也可以,但是 从性能方面考虑,不建议使用协议的方式

1
2
3
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return UITableViewAutomaticDimension;
}

结论

应该是Xcode9在处理UITableView时,对属性 rowHeight 的支持出现了问题。以下摘自UIKit中源码。

1
@property (nonatomic) CGFloat rowHeight; // default is UITableViewAutomaticDimension

注释中提到该属性的默认值就是UITableViewAutomaticDimension。

坚持原创技术分享,您的支持将鼓励我继续创作!