13

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

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

但没有成功。

4

3 回答 3

22

经过多次头部撞击,我找到的解决方案是使用moveItemAtIndexPath:toIndexPathinside of performBatchUpdates:completion. 根据以下文档performBatchUpdates:completion

如果您想在一个动画操作中插入、删除、重新加载或在集合视图中移动单元格,而不是在几个单独的动画中,您可以使用此方法。使用更新参数中传递的阻塞来指定您要执行的所有操作。

所以,我基本上做的是

[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];
}];
于 2012-12-17T19:03:27.637 回答
0

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

- 确保您实际上重新排序了基础模型集合,以便在您下次完全重新加载时保持更改。

于 2012-12-14T23:48:41.360 回答
0

SWIFT代码:

        self.collectionView.performBatchUpdates({
            self.collectionView.moveItem(at: selectedIndexPath, to: targetIndexPath)
            self.collectionView.moveItem(at: targetIndexPath, to: selectedIndexPath)
        }, completion: nil)
于 2017-12-14T11:40:46.370 回答