如何在 UICollectionView 拖放期间删除“幽灵”单元格,并使移动单元格不透明?

Posted

技术标签:

【中文标题】如何在 UICollectionView 拖放期间删除“幽灵”单元格,并使移动单元格不透明?【英文标题】:How to remove 'ghost' cell during UICollectionView drag/drop, and make moving cell opaque? 【发布时间】:2019-09-25 12:05:24 【问题描述】:

我正在尝试在我的 UICollectionView 中实现拖放机制,这与在 Shortcuts 应用程序中重新排序快捷方式的组件非常相似。

到目前为止,行为是当您开始拖动时,会留下一个透明的单元格视图,而另一个透明的单元格视图会随着手指移动。

我想摆脱“幽灵”细胞,让移动的细胞完全不透明。

这是我的拖放行为(主要取自 this post)

func collectionView(_ collectionView: UICollectionView, itemsForBeginning session: UIDragSession, at indexPath: IndexPath) -> [UIDragItem] 
    let item = itemData[indexPath.item]
    let itemProvider = NSItemProvider(object: item.title as NSString)
    let dragItem = UIDragItem(itemProvider: itemProvider)
    dragItem.localObject = item


    return [dragItem]


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

    if collectionView.hasActiveDrag 
        return UICollectionViewDropProposal(operation: .move, intent: .insertAtDestinationIndexPath)
    

    return UICollectionViewDropProposal(operation: .forbidden)


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

    var destinationIndexPath: IndexPath
    if let indexPath = coordinator.destinationIndexPath 
        destinationIndexPath = indexPath
    
    else 
        let row = collectionView.numberOfItems(inSection: 0)
        destinationIndexPath = IndexPath(row: row - 1, section: 0)
    

    reorderItems(coordinator: coordinator, destinationIndexPath: destinationIndexPath, collectionView: collectionView)



fileprivate func reorderItems(coordinator: UICollectionViewDropCoordinator,
                              destinationIndexPath: IndexPath,
                              collectionView: UICollectionView) 

    if let item = coordinator.items.first,
        let sourceIndexPath = item.sourceIndexPath 

        collectionView.performBatchUpdates(
            self.itemData.remove(at: sourceIndexPath.item)
            self.itemData.insert(item.dragItem.localObject as! PlanItem, at: destinationIndexPath.item)

            collectionView.deleteItems(at: [sourceIndexPath])
            collectionView.insertItems(at: [destinationIndexPath])
        , completion: nil)

        coordinator.drop(item.dragItem, toItemAt: destinationIndexPath)
    

【问题讨论】:

【参考方案1】:

不确定问题是否仍然存在,但如果是: 这是处理单元格拖动状态的方法:

Is there a method to check the UICollectionView item drag cancellation if the item wasn't moved?

只需通过 DispatchQueue.main.async

将其隐藏在拖动中

并在 .none 状态下再次可见。为我工作:)

【讨论】:

这并没有解释如何隐藏幽灵单元。

以上是关于如何在 UICollectionView 拖放期间删除“幽灵”单元格,并使移动单元格不透明?的主要内容,如果未能解决你的问题,请参考以下文章

UICollectionView 快速拖放

如何在 dragover/dragenter HTML 5 拖放期间更改图标

IOS拖放与缩放

如何在 OSX 上拖放期间检测 META 按键

在具有 UITableView 的 UICollectionView 中拖放

拖放 UICollectionView 单元格重用问题