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

Posted

技术标签:

【中文标题】是否可以在使用 UICollectionViewFlowLayout 的 UICollectionView 中交换 2 个单元格?【英文标题】:Is it possible to swap 2 cells in a UICollectionView that is using UICollectionViewFlowLayout? 【发布时间】:2012-12-14 21:37:30 【问题描述】:

假设我有一个使用 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

但没有成功。

【问题讨论】:

【参考方案1】:

经过多次头部撞击,我找到的解决方案是在performBatchUpdates:completion 内部使用moveItemAtIndexPath:toIndexPath。根据documentation为performBatchUpdates:completion

如果您想在一个动画操作中插入、删除、重新加载或在集合视图中移动单元格,而不是在多个单独的动画中,您可以使用此方法。使用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];
];

【讨论】:

您能否提供一些解释此特定问题的代码或教程。你是怎么解决这个问题的? 你能在这个问题中提供任何关于这个问题的线索吗? ***.com/questions/25803120/… 嗨 Zac24。我不知道此特定问题的任何示例代码。对不起。 另外,您链接到的问题似乎已得到解答。你能详细说明一下吗? 如果你愿意帮忙,那么我可以把我的代码/项目展示一下我到目前为止所做的尝试。【参考方案2】:

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

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

【讨论】:

是的,我试过这样做。但由于我使用的是 UICollectionViewFlowLayout,因此动画无法正常工作,因为它会尝试更新源索引路径和目标索引路径之间的单元格。【参考方案3】:

Swift 代码:

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

【讨论】:

以上是关于是否可以在使用 UICollectionViewFlowLayout 的 UICollectionView 中交换 2 个单元格?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在静态方法中使用视图绑定?

是否可以在不使用ajax请求的情况下检查用户是否在线?

是否可以在 React 中使用 React.useState(() => )?

是否可以在 Excel UDF 中使用反斜杠 `\` 字符?

是否可以在 MyBatis 中使用聚合函数

是否可以在使用一个等值对象字段的对象数组上使用包含? [复制]