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:)