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

xin*_*nil 9 uitableview ios autolayout swift

我有一个 UITableView,其中填充了自动调整大小的单元格。\nUITableView设置相当简单:

\n\n
    tableView.estimatedRowHeight = 70\n    tableView.rowHeight = UITableViewAutomaticDimension\n
Run Code Online (Sandbox Code Playgroud)\n\n

完全像苹果在这里推荐的那样:https://developer.apple.com/library/content/documentation/UserExperience/Conceptual/AutolayoutPG/WorkingwithSelf-SizingTableViewCells.html

\n\n
\n

要启用自动调整表格视图单元格大小,必须将表格视图\xe2\x80\x99s\n rowHeight 属性设置为 UITableViewAutomaticDimension。您还必须\n 为estimatedRowHeight 属性分配一个值。一旦设置了这两个属性,系统就会使用自动布局来计算行xe2x80x99 的实际高度。

\n
\n\n

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

\n\n

所有其他方面都工作得很好:标签确实会更改其文本,您可以隐藏/取消隐藏视图,但布局会卡住,直到重新使用单元格为止。

\n\n

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

\n

car*_*ine 7

我也遇到了你的问题。而不是删除

tableView.estimatedRowHeight = 70
Run Code Online (Sandbox Code Playgroud)

我刚刚在 cellForRow 方法的末尾添加了一个layoutIfNeeded,就在返回单元格本身之前:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "identifier", for: indexPath) as? MyCustomCell
    ...
    cell?.layoutIfNeeded()
    return cell!
}
Run Code Online (Sandbox Code Playgroud)

结果:单元布局始终完美,无论是第一次还是每次重复使用后。


d4R*_*4Rk 7

不幸的是,所提供的答案/评论都不适合我。我总是得到最初不正确的布局。仅在重用单元格或调用reloadData()(在表视图上)后,它才能正确显示。

以下是唯一最终对我有用的事情。我不太喜欢这样的黑客,但在这个看似非常简单的布局问题上花了大约半天的时间后,我放弃了并继续它。>.<

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    DispatchQueue.main.async {
        self.tableView.reloadData()
    }
}
Run Code Online (Sandbox Code Playgroud)

或者,您也可以调用reloadDataviewDidAppear(无需DispatchQueue破解),但是当布局从“不正确”跳转到“正确”时,您可以清楚地看到“跳转”。

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


xin*_*nil 2

就我而言,该问题是由 引起的estimatedRowHeight

\n\n

只需删除这一行

\n\n
tableView.estimatedRowHeight = 70\n
Run Code Online (Sandbox Code Playgroud)\n\n

解决了我的问题。Cell 正确地更新了它的布局,它几乎解决了我的问题。

\n\n

但是,最有可能的是,您\xe2\x80\x99 会遇到另一个麻烦,因为您的单元格\xe2\x80\x99s 高度被设置为43.5 点。您的日志还将充满自动布局错误,其中将包括这样的行

\n\n
<NSLayoutConstraint:0x600000097570 'UIView-Encapsulated-Layout-Height' UITableViewCellContentView:0x7fd4ee511d20.height == 43.5   (active)>\n
Run Code Online (Sandbox Code Playgroud)\n\n

显然,如果您不提供\xe2\x80\x99t estimatedRowHeight,表格视图会对您的cell\xe2\x80\x99s内容视图施加43.5点的高度限制,并且如果您的cell\xe2\x80\x99s\xe2\x80\x9cinternal\ xe2\x80\x9d 高度不匹配(概率为 99.99%),然后它\xe2\x80\x99s 会将错误记录到日志中。

\n\n

如何避免该错误?我还不知道\xe2\x80\x99。\n我发布了一个有关此问题的问题,一旦找到答案,我将在这个问题中提供一个链接。

\n