Swift 检测 UICollectionViewCell 是否被拖到另一个 UICollectionViewCell 之上

Swift detect if UICollectionViewCell is dragged on top of another UICollectionViewCell

我有一个 UICollectionView,只有 1 个部分,该部分中有许多单元格。我启用了拖放行为(使用长按手势识别器,因为 UICollectionView 位于通用 UIViewController 中)。

我想要拖放行为来检测拖动的单元格何时位于另一个单元格的顶部。 Google 搜索没有产生任何有用的结果,但 Whosebug 有 this solution。虽然我可以尝试通过在 UIViewController class 中编写类似的东西来实现这一点,以检查拖动的单元格的 Rect 是否与 每个其他单元格 相交,但我想知道有没有更有效的方法来实现这个目标?

在我的脑海中,我认为你可以只获取拖动视图的最小和最大 X 或 Y 坐标(取决于集合视图是水平还是垂直),然后通过二进制搜索集合中的视图,直到找到相交的视图。这样,您就不必测试所有视图。

编辑:添加一个例子来阐明我的意思。假设我们有一组从左到右排列的视图:

0 1 2 3 4 5 6 7 8 9 10

我们首先获取拖动视图的最小和最大 X 值。我们称它们为 "minX" 和 "maxX"。我们首先查看列表中间的视图,即视图 5。如果 maxX < 视图 5 的最小 X,则我们要查找的视图必须是 0...4 之一。如果 minX > 查看 5 的最小 X,那么我们正在寻找 6...10 中的内容。否则视图 5 在水平维度上与拖动的视图相交。

测试视图 5 后,我们测试视图 2 或视图 8,具体取决于拖动的视图是在视图 5 的左侧还是右侧。我们继续使用此方法,直到遇到重叠视图,并且每个视图当我们测试一个视图时,我们从考虑中排除了一半的视图,因此它会比必须测试集合中的每个视图表现得更好。

一旦找到与拖动视图重叠的视图,您将需要检查相邻视图以查看它们是否也重叠。如果拖动的视图与其他几个视图重叠,则必须选择重叠面积最大的一个。