在重用单元格之前,UITableViewCell布局不会更新

时间:2016-11-10 18:05:55

标签: ios swift uitableview autolayout

我有一个UITableView,我填充自动调整单元格。 UITableView设置非常简单:

    tableView.estimatedRowHeight = 70
    tableView.rowHeight = UITableViewAutomaticDimension

正如Apple建议的那样:https://developer.apple.com/library/content/documentation/UserExperience/Conceptual/AutolayoutPG/WorkingwithSelf-SizingTableViewCells.html

  

要启用自行调整表格视图单元格,必须设置表格视图   rowHeight属性为UITableViewAutomaticDimension。你也必须   为estimatedRowHeight属性赋值。一旦两个   设置这些属性后,系统使用自动布局来计算   行的实际高度。

配置单元格时,我还禁用/启用一些约束以实现所需的外观。这就是事情变得有趣的地方。在重复使用单元格之前,不会更新单元格布局。从字面上看。您可以拨打layoutIfNeeded()setNeedsLayout()layoutSubviews()或其他任何方法,您无法强制单元格更新其布局。

所有其他方面的效果都非常好:标签会更改文本,隐藏/取消隐藏视图,但布局会一直停留,直到重复使用单元格。

问题:是什么导致它以及如何避免这种行为?

3 个答案:

答案 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),但是当布局从“不正确”跳转到“不正确”时,您可以清楚地看到“跳转” “正确”。

无论如何,只是想分享我的经验,并希望这对其他人有帮助。干杯!