【问题标题】:UICollectionView: drag/move one cell onto another (no reordering)UICollectionView:将一个单元格拖动/移动到另一个单元格(无重新排序)
【发布时间】:2021-05-09 09:08:39
【问题描述】:

我想迅速将 UICollectionView 中的一个单元格拖到另一个单元格上。 我找到了几个很好的重新排序教程,但我只想移动触摸的元素,其他单元格应保持其位置。 通过将一个项目拖到另一个项目上来创建文件夹的行为与在主屏幕上的行为相同。

已经使用 UICollectionView 和以下事件设置视图控制器:

func collectionNode(_ collectionNode: ASCollectionNode, canMoveItemWith node: ASCellNode) -> Bool {}

func collectionNode(_ collectionNode: ASCollectionNode, moveItemAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) {}

@objc func handleLongGesture(gesture: UILongPressGestureRecognizer) {}

终于想通了:

self.collectionView.view.updateInteractiveMovementTargetPosition(gesture.location(in: gesture.view!))

将通过重新排序项目来更新视图。是否有任何替代/选项来保持其他项目的位置?

【问题讨论】:

  • 这不是我们在这里展示代码的方式。
  • 谢谢。明白了!

标签: ios swift iphone uicollectionview drag


【解决方案1】:

好的,使用了错误的 API 函数。如果你有类似的问题,请关注Ray的教程:https://www.raywenderlich.com/3121851-drag-and-drop-tutorial-for-ios

尽管它有其复杂性,但这是非常自我解释的。

底线:上面讨论的 API 函数仅提供项目的重新排序,将项目相互放置,这是一个拖放操作,只需要实现三个函数:

func collectionView(_ collectionView: UICollectionView, itemsForBeginning session: UIDragSession, at indexPath: IndexPath) -> [UIDragItem] {}

func collectionView(_ collectionView: UICollectionView, performDropWith coordinator: UICollectionViewDropCoordinator) {}

func collectionView(_ collectionView: UICollectionView, dropSessionDidUpdate session: UIDropSession, withDestinationIndexPath destinationIndexPath: IndexPath?) -> UICollectionViewDropProposal {}

确保在最后一个函数中使用 UICollectionViewDropProposal(operation: .move, intent: .insertIntoDestinationIndexPath) 作为返回以允许在对象上方移动,否则 Swift UI 将再次更改现有项目的位置。

此外,请确保启用拖动: view.dragInteractionEnabled = true

view 就是你的集合视图。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-22
    • 1970-01-01
    • 1970-01-01
    • 2018-03-26
    • 1970-01-01
    • 1970-01-01
    • 2014-03-20
    相关资源
    最近更新 更多