我有一个UITableView,我填充自动调整单元格。
UITableView
设置非常简单:
tableView.estimatedRowHeight = 70
tableView.rowHeight = UITableViewAutomaticDimension
要启用自行调整表格视图单元格,必须设置表格视图 rowHeight属性为UITableViewAutomaticDimension。你也必须 为estimatedRowHeight属性赋值。一旦两个 设置这些属性后,系统使用自动布局来计算 行的实际高度。
配置单元格时,我还禁用/启用一些约束以实现所需的外观。这就是事情变得有趣的地方。在重复使用单元格之前,不会更新单元格布局。从字面上看。您可以拨打layoutIfNeeded()
,setNeedsLayout()
,layoutSubviews()
或其他任何方法,您无法强制单元格更新其布局。
所有其他方面的效果都非常好:标签会更改文本,隐藏/取消隐藏视图,但布局会一直停留,直到重复使用单元格。
问题:是什么导致它以及如何避免这种行为?
答案 0 :(得分:1)
我也有你的问题。而不是删除
tableView.estimatedRowHeight = 70
我刚刚在cellForRow方法的末尾添加了一个layoutIfNeeded,就在返回单元格之前:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "identifier", for: indexPath) as? MyCustomCell
...
cell?.layoutIfNeeded()
return cell!
}
结果:细胞布局始终是完美的,第一次和每次重复使用后。
答案 1 :(得分:0)
就我而言,问题是由estimatedRowHeight
引起的。
只需删除此行
即可tableView.estimatedRowHeight = 70
解决了我的问题。 Cell正确更新了它的布局,几乎解决了我的问题。
但是,最有可能的是,你的另一个麻烦,你的牢房高度设定为43.5分。您的日志也将填充自动布局错误,其中包含类似
的行<NSLayoutConstraint:0x600000097570 'UIView-Encapsulated-Layout-Height' UITableViewCellContentView:0x7fd4ee511d20.height == 43.5 (active)>
显然,如果您不提供estimatedRowHeight
,表格视图会对您的单元格的内容视图设置一个43.5点的高度约束,如果您的单元格的“内部”高度不匹配(并且该概率为99.99%) ),然后它会把错误记录在日志中。
如何避免该错误?我还不知道。 我发布了一个问题,一旦我找到答案,我将在这个问题中提供一个链接。
答案 2 :(得分:0)
不幸的是,提供的答案/评论都没有为我解决。我总是以最初不正确的布局而告终。仅在重新使用单元格或调用reloadData()
(在表视图上)之后,它才能正确显示。
以下是唯一对我有用的东西。我不是这种黑客的忠实拥护者,但是在这个看似非常简单的布局问题上花了大约半天的时间后,我才放弃并接受了它。 >。<< / p>
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
或者,您也可以在reloadData
中调用viewDidAppear
(没有DispatchQueue
hack),但是当布局从“不正确”跳转到“不正确”时,您可以清楚地看到“跳转” “正确”。
无论如何,只是想分享我的经验,并希望这对其他人有帮助。干杯!