Ios 章节标题“;“反弹”;重新加载UITableView时
我有一个Ios 章节标题“;“反弹”;重新加载UITableView时,ios,swift,uitableview,batch-updates,Ios,Swift,Uitableview,Batch Updates,我有一个UITableView,当应用程序的状态发生变化时,它会进行批量更新。更改可能会影响多个行/节或仅影响一个节(但不影响1行或多行) 我注意到,在进行单个分区更新时(这可能会影响分区中的许多行),其他分区的分区标题会“反弹”或“移动”到以前的位置,然后设置动画恢复到原来的位置 一幅画能描绘千言万语 这些部分不是批处理更新的一部分 UITableView/控制器通过一个针对iOS 11的故事板进行设置。UITableView利用了“估计”的行和截面高度,单元格使用自动布局进行布局 UIT
UITableView
,当应用程序的状态发生变化时,它会进行批量更新。更改可能会影响多个行/节或仅影响一个节(但不影响1行或多行)
我注意到,在进行单个分区更新时(这可能会影响分区中的许多行),其他分区的分区标题会“反弹”或“移动”到以前的位置,然后设置动画恢复到原来的位置
一幅画能描绘千言万语
这些部分不是批处理更新的一部分
UITableView
/控制器
通过一个针对iOS 11的故事板进行设置。UITableView
利用了“估计”的行和截面高度,单元格使用自动布局进行布局
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()
行和节动画属性(即删除节动画
)设置为自动
。我已尝试将分区动画设置为none
,没有任何差异
我尝试过以不同的组合删除reloadData
和layoutifneed
,虽然它们会产生其他问题,但似乎无法解决此问题
我注意到的一件事是,这似乎只发生在UITableView
的更新在屏幕外完成时
我花了一些时间试图找到问题的解决方案(比如不调用reloadData
),但找不到有效的方法
我是否应该查看其他属性、函数,或者更新的执行顺序是否错误
笔记
- 这是一个“静态”表格,通过故事板设置
- 行和节在状态更改期间被添加/删除,这似乎会触发滚动视图中的问题/更改
- 虽然禁用动画(使用
)似乎可以解决问题,但这是一个不理想的解决方案,因为它会删除所有更新(在屏幕上或屏幕外)的动画UIView.setAnimationEnabled
- 该问题仅在滚动视图不在视图顶部时发生,而在将表格视图一直滚动到顶部时发生的更新/动画没有问题
- 我尝试使用
确定更新是在屏幕上还是在屏幕外进行,并使用indexPathsForVisibleRows
禁用动画,但如果更新发生在屏幕上,而表视图未滚动到滚动视图的顶部,则无法解决此问题UIView.setanimationEnabled
UIView.setanimationEnabled
设置为false
?然后在完成更新后将其设置回“true”?否则,如果您已经尝试过此方法,是否可以尝试创建一个显示此问题的小项目?@TNguyen我尝试过使用UIView.setanimationEnabled
,虽然它确实纠正了此问题,但它显然会停止我想要的所有其他动画。我一直在寻找一种解决方案,在更新不在屏幕上时使用UIView.SetAnimationEnabled
,但由于状态管理非常复杂,因此任何时候更新都会出现在可见区域,而表格视图不在滚动视图的顶部,我遇到了与上述相同的问题,不确定这是否有效,因为我以前从未使用过它,但在阅读文档后,它可能会很有用,也许可以尝试在UIView中使用它。在没有动画的情况下执行@TNguyen我很确定这只是setAnimationEnabled
的一种说服。不幸的是,禁用动画真的不是一个选项(因为当屏幕上出现更新时我需要它们)。我已经实现了一个版本,它解决了在更新过程中滚动视图在该位置反弹的问题,但节标题仍然是“反弹”/“移动”@TNguyen最重要的问题似乎是使用自动布局和估计的单元格/节高度