重新加载UITableView时,节标题“跳出”

时间:2017-11-07 23:58:07

标签: ios swift uitableview batch-updates

我有一个UITableView,当应用状态发生变化时,它会进行批量更新。更改可能会影响多个行/部分或仅影响一个部分(但是一行或多行)。

我注意到,当进行单个部分更新(可能会影响该部分中的多个行)时,其他部分的部分标题会“跳出”或从之前的位置“移动”,然后进行动画处理回到原地。

一张图片描绘了千言万语......

Video Capture

这些部分不是批量更新的一部分。

UITableView / Controller是通过面向iOS 11的故事板设置的。UITableView正在使用“估算”行和部分高度,并使用自动布局。

Xcode storyboard properties

UITableViewController使用更大的数据模型来管理状态和状态更改操作。 API确保根据模型的所需状态计算所需的更新(即删除和更新与“先前”状态相关,插入与“新”状态相关)

最后一步是通过批量更新过程将计算出的更改应用于表格视图...

tableView.beginUpdates()

// Calculate the rows/sections which need to be changed

if let ops = operation.sections[.delete], ops.count > 0 {
    tableView.deleteSections(ops, with: deleteSectionAnimation)
}
if let ops = operation.sections[.update], ops.count > 0 {
    tableView.reloadSections(ops, with: reloadSectionAnimation)
}
if let ops = operation.sections[.insert], ops.count > 0 {
    tableView.insertSections(ops, with: insertSectionAnimation)
}

if let ops = operation.rows[.delete], ops.count > 0 {
    tableView.deleteRows(at: ops, with: deleteRowAnimation)
}
if let ops = operation.rows[.update], ops.count > 0 {
    tableView.reloadRows(at: ops, with: reloadRowAnimation)
}
if let ops = operation.rows[.insert], ops.count > 0 {
    tableView.insertRows(at: ops, with: insertRowAnimation)
}
tableView.endUpdates()

tableView.reloadData()
tableView.layoutIfNeeded()

行和部分动画属性(即deleteSectionAnimation)设置为automatic。我已经尝试将部分动画设置为none而没有任何差异

我尝试以不同的组合删除reloadDatalayoutIfNeeded,但在创建其他问题时,它们似乎无法解决此问题

我注意到的一件事是,只有UITableView的更新发生在屏幕外时才会发生这种情况

我花了一些时间试图找到问题的解决方案(比如没有调用reloadData),但找不到有用的东西。

是否有其他属性,我应该查看的功能或更新执行错误的顺序?

注释

  • 这是一个“静态”表格,通过故事板设置
  • 在状态更改期间添加/删除行和部分,这似乎会在滚动视图中触发问题/更改
  • 虽然禁用动画(使用UIView.setAnimationsEnabled)确实可以解决问题,但这是一个不受欢迎的解决方案,因为它会删除所有更新的动画(屏幕上或屏幕外)
  • 仅当滚动视图不在视图顶部时才会出现此问题,当表格视图一直滚动到顶部时发生的更新/动画没有问题
  • 我尝试使用indexPathsForVisibleRows确定更新是在屏幕上还是在屏幕外发生,并使用UIView.setAnimationsEnabled禁用动画,但如果更新发生在 System.DirectoryServices.AccountManagement.UserPrincipal.Current.DisplayName; 上,则无法解决问题屏幕而桌面视图未滚动到滚动视图的顶部

0 个答案:

没有答案