自定义UICollectionViewCell拖动预览视图

5
我正在尝试实现一个功能,即用户将一个collectionview单元格拖放到另一个单元格上。然而,我希望完全改变移动中的预览内容,以匹配我的应用程序的视觉隐喻(该项不在移动,包含该项的东西在移动)。
例如,假设我的collectionview单元格显示一支猪笔,而我想让猪从一个笔筒移动到另一个笔筒,预览视图应该是显示一个单独的猪,而不是整个笔筒。虽然这与Apple意图使用其API的略有不同,但我认为这是一种有效的用法。
我已经看到了func collectionView(_ collectionView: UICollectionView, dragPreviewParametersForItemAt indexPath: IndexPath) -> UIDragPreviewParameters,但那只让你稍微裁剪一下它,并没有重新做整个视图。
有什么想法或思路吗?

你是否考虑过禁用集合视图的拖放功能并使用自己的实现方式?你可以使用 UILongPressGestureRecognizer 添加自己的拖动预览视图,以及使用 UIPanGestureRecognizer 进行移动。长按的起始点和平移的结束点应该能够通过 indexPathForItem(at point: CGPoint) 来获取拖放的源和目标。 - Swapnil Luktuke
1个回答

12

自iOS 11以来,您可以利用UIDragItem。这里还有

open var previewProvider: (() -> UIDragPreview?)?

一个简单的例子:

func collectionView(_ collectionView: UICollectionView, itemsForBeginning session: UIDragSession, at indexPath: IndexPath) -> [UIDragItem]
{
    ...
    let dragItem: UIDragItem = ....
    dragItem.localObject = item
    dragItem.previewProvider = { () -> UIDragPreview? in
        let imageView = UIImageView(image: UIImage(named: "preivewOfThingInMotion"))
        imageView.frame = CGRect(x: 0, y: 0, width: 64, height: 64)
        return UIDragPreview(view: imageView)
    }
    return [dragItem]
}

一旦您开始拖动一个项目,拖动图像将更改为您的自定义视图。

Demo

在演示中,您可以看到两个UICollectionViews。从上面的UICollectionView开始启动拖放操作,然后将项目拖到下面的一个。随着项目的移动,将显示项目的自定义预览。

enter image description here

这是您要寻找的内容吗?


2
如何在拖动之前自定义它的提起方式。 - Benny Wijaya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接