如何解决UICollectionView:将一个单元格拖动/移动到另一个单元格无需重新排序
在 swift 中,我想将 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!))
将通过重新排序项目来更新视图。有没有其他选择/选项可以保持其他项目的位置?
解决方法
好的,使用了错误的 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 是您的集合视图。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。