我正在使用 aUICollectionView
来显示场上不同位置的球员。每个单元格都包含显示玩家姓名和位置名称的标签。视图中的位置由从数据源读取位置信息的自定义布局确定……即字段上的位置与数据源中的索引无关,就像在流布局中一样。不同位置的单元格也有点不同......“cellForItemAtIndexPath”根据位置从各种重用标识符中进行选择。
我希望用户能够交换位置的球员。只要我只更新集合视图数据源并调用[self.collectionView reloadData]
. 但我想动画单元格的交换,所以用户可以看到变化。我正在使用此代码,其中 inboundSourceIndex 和 outboundSourceIndex 先前已设置为正在交换的项目:
[self.collectionView performBatchUpdates:^{
[self.collectionView moveItemAtIndexPath:inboundOriginIndex toIndexPath:outboundOriginIndex];
[self.collectionView moveItemAtIndexPath:outboundOriginIndex toIndexPath:inboundOriginIndex];
} completion:nil];
}
[self assignmentsUpdate]; // This method updates the data source for the collection view
[self.collectionView.collectionViewLayout invalidateLayout];
[self.collectionView reloadData];
插入批量更新后,我得到了所需的单元格动画,这些单元格似乎相互交换,玩家名称标签正确显示,并且布局为单元格提供了正确的框架(可能会有所不同)。但其他一切都是混乱的:位置标签没有更新,单元格没有使用正确的重用标识符重新加载——就像 collectionView 并没有真正调用cellForItemAtIndexPath
. 我尝试更改数据更新和 reloadData 的顺序,但无济于事。我可以看到移动单元格可能会如何暂时改变 indexPaths,但是在我调用invalidateLayout
and之后,collectionView 怎么会看起来不对reloadData
?那不是根据数据源从头开始构建视图吗?