如何在具有自动布局的 UITableView 上 prepareForReuse?

How to prepareForReuse on a UITableView with auto-layout?

我有一个 UITableView,其中包含使用自动布局的自动尺寸单元格。此外,单元格的所有子视图都使用自动布局(编程约束)。

由于这些单元格及其相应的子视图具有独特的不同大小,因此当它们被重复使用时,单元格和子视图的约束似乎并没有失效和重置,这导致以下结果:

问题说明:

Without reuse With reuse

我已经在 prepareForReuse 函数中尝试了各种方法,但我无法重置所有约束。 如何实现?

我试过的东西:

override func prepareForReuse() {
    super.prepareForReuse()
    
    invalidateIntrinsicContentSize()
    removeConstraints(constraints)
    subviews.forEach( { [=10=].removeConstraints([=10=].constraints); [=10=].invalidateIntrinsicContentSize()  })
    
    
    setNeedsUpdateConstraints()
}

这种情况就是为什么有多个重用桶的原因。为每个 type 单元格使用不同的单元格子类/重用字符串。这样,就没有什么可做的了:只需设置一次单元格,让自动布局负责调整大小,例如,当文本不同或(对于图像单元格)图像不同时。

我建议不要删除所有约束并在准备好重用单元时重建它们。相反,我会为您的约束添加出口,然后更新它们的常量以更改它们的 sizing/spacing,或者将它们分成不同的用例集合并使用 activate(_:)deactivate(_:)转向不同的约束集 on/off。 (或者调整常量和打开和关闭一些约束的组合。

使用不同的标识符设置不同类型的单元格也可能更简单,并且只需在创建这些单元格时对每种类型设置约束即可。事实上,我会把它作为我的第一选择。