tableView.beginUpdates()表现得很奇怪

时间:2017-11-13 09:48:36

标签: swift uitableview

情况(使用Swift 4.0&>> iOS10.0)

  • 我有一个带有节和行的TableView。每个单元只有一个 标签并配置为使其高度适应其标签的高度 感谢自动布局。
  • 单击单元格时,它会显示另一个可能不是的字符串 大小相同(因此行数不同)。 我有 麻烦动画正确的单元格,所以当它被点击,它 调整其高度以正确显示新标签

尝试

  1. 重新加载显示所选内容的新数据的整个表格视图 细胞工作正常,但它不是我想要实现的。

  2. 我尝试了tableView.beginUpdates()tableView.endUpdates()(有和没有完成处理程序)。当我点击单元格时,它会按预期的方式对所选单元格起作用,但其他单元格和所有部分会跳转和/或消失。这种行为很奇怪,看起来我正在搞乱禁用的功能,但行为就是我要找的。

  3. 我试过.reloadRows(at: [indexPath], with: .automatic)。它的行为几乎与tableView.beginUpdates()完全相同(并重新加载tableView,我更愿意避免)。

  4. 我尝试过n°2& n°3与layoutIfNeeded()layoutSubviews()一起,没有帮助。

  5. 代码示例

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
      {
       // Attempt n°2
       tableView.beginUpdates()
       tableView.endUpdates()
    
       // Attempt n°3 (alternatively to attempt n°2)
       tableView.reloadRows(at: [indexPath], with: .automatic)
      }
    

    问题:

    tableView.beginUpdates()是解决问题的最佳方法吗?如果是这样,我应该如何使用它?如果没有,那么为细胞设置动画的正确方法是什么?

2 个答案:

答案 0 :(得分:0)

例如,尝试在tableView.estimatedRowHeight = 0中设置viewDidLoad()。我对beginUpdates()endUpdates()的动画遇到了同样的问题,这有帮助。但在我的情况下,我使用heightForRowAtIndexPath方法。

答案 1 :(得分:-1)

这似乎是由this answer解决的类似问题。

这比链接的答案简单得多。您希望在更新方法之间添加tableView.setNeedsLayout()。这告诉表视图在更新周期结束时的布局。

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    // Change text
    ...

    // Update height
    tableView.beginUpdates()
    tableView.setNeedsLayout()
    tableView.endUpdates()
}