如何在使用 reloadData 时执行单元格选择动画?

Posted

技术标签:

【中文标题】如何在使用 reloadData 时执行单元格选择动画?【英文标题】:How do I perform cell selection animations while using reloadData? 【发布时间】:2015-06-21 17:20:21 【问题描述】:

我有一个UICollectionView,我在UICollectionViewCell 子类中覆盖setSelected 以在用户选择单元格时执行一个小反弹动画。

问题在于,在选择单元格时,单元格的选择会改变其他单元格的数据(例如,假设其他单元格中的每个单元格都有一个标签,其中显示了所选单元格的数量)。所以我调用collectionView.reloadData() 以便所有其他单元格也更新以显示新数据(例如,标签中选择的单元格数量)。

但是,这个reloadData() 调用似乎完全重置了UICollectionView。任何正在发生的动画都会停止,并且单元格会在没有动画的情况下简单地更新。

如何让单元格选择动画同时更新其他单元格?

我尝试仅在动画完成后调用reloadData(),但这使得更新其他单元格时看起来存在滞后/延迟(因为它直到动画完成后才更新它们) , 这看起来不太好。

同样,我尝试调用reloadItemsAtIndexPaths:(并排除将动画的选定单元格),但无论出于何种原因,对于集合视图,此方法似乎真的很慢。就像按下它后有明显的延迟一样。

我应该在这里做什么?在集合视图不破坏正在进行的动画的情况下重新加载数据的标准是什么?

【问题讨论】:

我的做法是等待动画完成,然后调用 reloadData()。如果您同时允许多个选择,您可以让动画完成查看一个变量,该变量在调用 reloadData() 之前跟踪是否有其他动画正在运行。 【参考方案1】:

重新加载会丢弃现有单元格并创建(或重复使用)新单元格。所以任何动画本质上都会被破坏。所以,不要重新加载。

相反,像往常一样更新您的数据模型,然后获取当前可见的索引路径和关联的单元格并直接更新这些单元格。

【讨论】:

以上是关于如何在使用 reloadData 时执行单元格选择动画?的主要内容,如果未能解决你的问题,请参考以下文章

使用 UITableView 的可变高度自定义单元格调用 reloadData 时保持 UITableView 的当前位置

UITableview 在 reloadData 后保留旧单元格

循环中的 tableView reloadData 不会在每次通过时绘制单元格

UITableView 在 reloadData 上向上滚动

点击/ reloadData不更改单元格时TableView单元格消失?

重新加载表视图数据并取消选择单元格