UICollectionViewCell 拖动预览的自定义视图

Posted

技术标签:

【中文标题】UICollectionViewCell 拖动预览的自定义视图【英文标题】:Custom View for UICollectionViewCell Drag Preview 【发布时间】:2019-03-28 09:07:45 【问题描述】:

我正在尝试实现一项功能,用户可以将一个collectionview 单元格拖放到另一个collectionview 单元格上。但是,我想完全更改运动中事物的预览,以匹配我的应用程序的视觉隐喻(项目没有移动,项目包含的东西正在移动)。

例如,假设我的collectionview 单元格显示了一圈猪,我想让猪从一个笔移动到另一个,预览视图应该是显示单个而不是笔的视图。它与苹果的 API 用途略有不同,但我认为它是有效的。

我见过func collectionView(_ collectionView: UICollectionView, dragPreviewParametersForItemAt indexPath: IndexPath) -> UIDragPreviewParameters 但这只是让你稍微剪辑它,而不是重新做整个视图。

有什么想法吗?/想法?

【问题讨论】:

您是否考虑过禁用集合视图的拖放并使用您自己的实现?您可以使用UILongPressGestureRecognizer 添加您自己的拖拽评论视图,并使用UIPanGestureRecognizer 移动它。长按的起点和平移的终点应该为您提供使用indexPathForItem(at point: CGPoint)拖放的来源和目的地@ 【参考方案1】:

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]

一旦您开始拖动项目,拖动图像周围就会更改为您的自定义视图。

演示

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

这就是你要找的吗?

【讨论】:

如何在它被提升时自定义它,我的意思是在它被拖动之前

以上是关于UICollectionViewCell 拖动预览的自定义视图的主要内容,如果未能解决你的问题,请参考以下文章

获取拖动预览的帧

UICollectionViewCell 在滚动开始后立即更改数据

使用 ThreeSixty 创建可拖动的 360 度全景图片预览效果

UIDragInteractionDelegate:如何在dragInteraction返回的拖动预览中显示透明部分(_:previewForLifting:session:)

js实现移动端图片预览:手势缩放, 手势拖动,双击放大...

模仿 UICollectionView 图片预览