检测用户将项目拖出 UICollectionView?
Posted
技术标签:
【中文标题】检测用户将项目拖出 UICollectionView?【英文标题】:Detect user dragging items out of UICollectionView? 【发布时间】:2013-08-09 05:42:57 【问题描述】:我有一个UICollectionView
,我希望能够将项目向上和拖出视图,从而删除它们。 (与 Dock 在 OS X 上的工作方式非常相似:拖掉一些东西然后松开,然后它就会被移除)。
我进行了一些研究,但我发现的几乎所有内容都在寻找可以拖放重新排序的 CollectionView。我不需要重新排序(我很高兴从源数组中删除给定索引处的项目,然后重新加载),我只需要检测项目何时移出视图并释放。
所以我想我的问题是:
1) 内置的 CollectionView、某种itemWasDraggedOutsideViewFromIndex:
方法或其他东西是否可以实现?
2) 如果没有,是否可以通过子类来完成(特别是对于 CollectionView 初学者来说是否可以)?
3) 有没有可以推荐的代码示例或教程?
【问题讨论】:
【参考方案1】:这是我一直在研究的一个辅助类:实现:https://github.com/Ice3SteveFortune/i3-dragndrop,希望对您有所帮助。在TestApp中有使用示例。
更新
大约一年过去了,现在这是一个完整的拖放框架。希望这证明有用:https://github.com/ice3-software/between-kit
【讨论】:
这太酷了。非常感谢 :) 期待改进。 谢谢!我目前在面向公众的应用程序中使用它,因此希望在接下来的几周内我能够将其标记为 100% 稳定。 但是有一个更新——我几乎已经完成了将它从一个简单的帮助类转换为一个成熟的框架。它现在支持不同类型的多个集合、自定义“拖放”渲染等等! 不能等待新的更新然后:)。我一直在检查你在 GitHub 上的 repo。它说正在大力发展。 即将发布!只需要提交 Podspec,我们就在那里【参考方案2】:没有您建议的内置方法。您想要做的事情可以完成,但您必须使用手势识别器和适当的代码来处理它来处理拖放操作。
我尝试使用子类来执行此操作,最后又将其放入我的视图控制器中。不过,就我而言,我将东西拖入/拖出集合视图以及屏幕上的其他两个视图。
我不知道你有没有这本书,但我发现对我最有帮助的是 Erica Sadun 的 Core ios6 开发人员的食谱,其中包含在集合视图中拖放的出色代码。我不认为它专门解决了 CV 之外的拖动问题,但对我来说,解决方案是将手势识别器放在公共超级视图上,并始终使用其坐标而不是子视图的坐标。
我遇到的一个问题是我希望能够通过点击和拖动来选择单元格,并且没有办法(尽管 Apple 的文档相反)要求单击手势在集合视图上失败。结果,我最终不得不使用长按手势来执行整个操作,并且长按没有translationInView(有locationInView),因此需要一些额外的工作:
iOS - Gesture Recognizer translationInView
另一件让事情变得更难或更容易的事情是您拥有的可能放置目标的数量。我有许多不同类型的视图(直接 UIView、collectionview 和 scrollViews)。我发现有必要维护一个“放置目标”列表,并在移动拖动的对象时测试与目标的交叉点。不知何故,您必须能够确定您正在相交的视图是否是可能发生跌落的地方。
如果您正在解决将某些内容拖出视图以将其删除(例如拖到垃圾箱视图)的特定情况,就是这样,这应该不复杂。您必须记住,当您进行变换时,您的框架变得毫无意义,但中心仍然是好的;所以你最终将中心用于你通常使用框架的所有东西。
这是我在网上找到的最有帮助的东西;我最终没有使用这个类,因为我认为在我的应用程序中实现它太复杂了。
http://www.ancientprogramming.com/2012/04/05/drag-and-drop-between-multiple-uiviews-in-ios/
希望这对您有所帮助。
【讨论】:
非常详细且很有帮助。谢谢!【参考方案3】:是的,有。
1 - 使您的视图符合 UIDropInteractionDelegate。
2 - 然后将此行添加到您的视图加载或初始化:
对于 viewcontroller 添加到 ViewDidload:
self.view.addInteraction(UIDropInteraction(delegate: self))
或者,对于 UIViews 添加到 init:
self.addInteraction(UIDropInteraction(delegate: self))
3 - 然后获取被拖到这里的项目的位置并玩得开心:
func dropInteraction(_ interaction: UIDropInteraction, sessionDidUpdate session: UIDropSession) -> UIDropProposal
print(session.location(in: self))
return UIDropProposal(operation: .move)
【讨论】:
以上是关于检测用户将项目拖出 UICollectionView?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用触摸将元素拖出可滚动的ListView,而不必保留元素[UWP]
如何知道用户是不是停止在 Flutter 中拖出我的小部件?
当在nestedscrollview的recyclerview中将项目拖出可见空间时-nestedscrollView不滚动