Objective c 是否可以在使用UICollectionViewFlowLayout的UICollectionView中交换2个单元格?

Objective c 是否可以在使用UICollectionViewFlowLayout的UICollectionView中交换2个单元格?,objective-c,uicollectionview,Objective C,Uicollectionview,假设我有一个使用UICollectionViewFlowLayout和以下格式的UICollectionView: 1 2 3 4 5 6 7 8 9 我触摸单元格9并将其拖动到单元格6上,将单元格9移动到单元格6所在的位置,将单元格6移动到单元格9所在的位置: 1 2 3 4 5 9 7 8 6 是否有任何方法可以轻松地将单元格6移动到单元格9所在的位置并设置其动画,以及将单元格9移动到单元格6所在的位置并设置其动画?或者我必须将UICollectionViewLayout子类化?如果必须

假设我有一个使用UICollectionViewFlowLayout和以下格式的UICollectionView:

1 2 3
4 5 6
7 8 9
我触摸单元格9并将其拖动到单元格6上,将单元格9移动到单元格6所在的位置,将单元格6移动到单元格9所在的位置:

1 2 3
4 5 9
7 8 6
是否有任何方法可以轻松地将单元格6移动到单元格9所在的位置并设置其动画,以及将单元格9移动到单元格6所在的位置并设置其动画?或者我必须将UICollectionViewLayout子类化?如果必须将UICollectionViewLayout子类化,将如何实现?我已经试着明确地设置了

-(UICollectionViewLayoutAttributes*)layoutAttributesForItemAtIndexPath:(NSIndexPath*)indexPath


但是没有成功。

您是否尝试过直接使用moveItemAtIndexPath:toIndexPath:重新排序项目


-确保您确实重新排序了基础模型集合,以便在下次进行完全重新加载时,更改仍然有效。

经过多次尝试后,我找到的解决方案是在
性能更新:完成
中使用
moveItemAtIndexPath:toIndexPath
。根据for
性能更新:完成

如果要在单个动画操作中插入、删除、重新加载或移动集合视图周围的单元格,而不是在多个单独的动画中,则可以使用此方法。使用updates参数中传递的blocked指定要执行的所有操作

所以,我基本上做的是

[self performBatchUpdates:^{
    [self moveItemAtIndexPath:fromIp toIndexPath:toIp];
    [self moveItemAtIndexPath:toIp toIndexPath:fromIp];
} completion:^(BOOL finished) {
    // update data source here
    // e.g [dataSource exchangeObjectAtIndex:fromIp.row withObjectAtIndex:toIp.row];
}];
Swift代码:

        self.collectionView.performBatchUpdates({
            self.collectionView.moveItem(at: selectedIndexPath, to: targetIndexPath)
            self.collectionView.moveItem(at: targetIndexPath, to: selectedIndexPath)
        }, completion: nil)

是的,我试过这么做。但由于我使用的是UICollectionViewFlowLayout,动画无法正常工作,因为它试图更新源索引路径和目标索引路径之间的单元格。您能否提供一些代码或教程来解释此特定问题。你是如何解决这个问题的?你能在这个问题上提供一些线索吗?你好,Zac24。我不知道这个特定问题的任何示例代码。抱歉。另外,您链接的问题似乎已得到回答。你能详细说明一下吗?如果你愿意帮忙的话,我可以把我的代码/项目展示给大家,让大家看看我迄今为止所做的努力。