0

我有一个UICollectionView,我希望能够将项目向上和拖出视图,从而删除它们。(与 Dock 在 OS X 上的工作方式非常相似:拖掉一些东西然后放开,然后它就被移除了)。

我做了一些研究,但我发现的几乎所有东西都是在寻找可以拖放到重新排序的 CollectionViews 。我不需要重新排序(我很高兴从源数组中删除给定索引处的项目,然后重新加载),我只需要检测项目何时移出视图并释放。

所以我想我的问题是:

1)内置的CollectionView,某种itemWasDraggedOutsideViewFromIndex:方法或其他东西有可能吗?

2)如果不是,它可以用子类来完成吗(特别是 CollectionView 初学者是否可以)?

3) 有没有可以推荐的代码示例或教程?

4

3 回答 3

3

这是我一直在研究的一个辅助类:实现: https ://github.com/Ice3SteveFortune/i3-dragndrop ,希望对您有所帮助。在 TestApp 中有关于如何使用它的示例。

更新

大约一年过去了,这现在是一个完整的拖放框架。希望这证明有用:https ://github.com/ice3-software/between-kit

于 2013-12-07T16:53:03.160 回答
3
  1. 没有像您建议的内置方法。您想要做的事情可以完成,但您必须使用手势识别器和适当的代码来处理它来处理拖放操作。

  2. 我尝试使用子类来执行此操作,最后又将其放入我的视图控制器中。不过,就我而言,我将东西拖入/拖出集合视图以及屏幕上的其他两个视图。

  3. 我不知道你有没有这本书,但我发现对我最有帮助的是 Erica Sadun 的 Core iOS6 开发人员的食谱,它在集合视图中的拖放代码方面非常出色。我不认为它专门解决了 CV 之外的拖动问题,但对我来说,解决方案是将手势识别器放在公共超级视图上,并始终使用其坐标而不是子视图的坐标。

我遇到的一个问题是我希望能够通过点击和拖动来选择单元格,并且没有办法(尽管 Apple 的文档相反)要求单击手势在集合视图上失败。结果,我最终不得不使用长按手势来执行整个操作,并且长按没有translationInView(有locationInView),因此需要一些额外的工作:

iOS - 手势识别器翻译InView

另一件会让事情变得更难或更容易的事情是您拥有的可能放置目标的数量。我有许多不同类型的视图(直接 UIView、collectionview 和 scrollViews)。我发现有必要维护一个“放置目标”列表,并在移动拖动的对象时测试与目标的交叉点。不知何故,您必须能够确定您正在相交的视图是否是可能发生下降的地方。

如果您正在解决将某些内容拖出视图以将其删除(例如拖到垃圾桶视图)的特定情况,就是这样,这应该不复杂。您必须记住,当您进行变换时,您的框架变得毫无意义,但中心仍然是好的;因此,您最终将中心用于通常使用框架的所有内容。

这是我在网上找到的最有帮助的东西;我最终没有使用这个类,因为我认为在我的应用程序中实现它太复杂了。

http://www.ancientprogramming.com/2012/04/05/drag-and-drop-between-multiple-uiviews-in-ios/

希望这有所帮助。

于 2013-08-09T06:45:43.707 回答
1

就在这里。

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)
}
于 2020-01-30T22:38:06.413 回答