我正在使用UICollectionView
来显示场上不同位置的玩家。每个单元格都包含显示玩家姓名和位置名称的标签。视图中的位置由自定义布局确定,该布局从数据源读取位置信息...即,字段上的位置与数据源中的索引无关,如在流布局中。对于不同的位置,单元格也有点不同......'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
和reloadData
后,collectionView怎么会出错呢?是不是基于数据源从头开始构建视图?