在 UICollectionView 中取消主动拖动

Cancel active drag in UICollectionView

我已经实施 UICollectionViewDragDelegate 以允许用户拖放集合视图单元格。我还在每个单元格中添加了 UILongPressGestureRecognizer。长按单元格后,拖动交互在长按手势状态开始之前被识别。如果你拖动它,它会取消长按手势。这很好用。

但是为了让这两个一起玩得更好,当长按手势被识别时(state == .began)我想以编程方式取消正在进行的拖动会话 - 取消它就像用户释放他们的手指导致不再拖动单元格,而是继续识别长按手势。否则,拖动和长按动作都会被激活,这在我的情况下效果不佳——需要一次激活一个或另一个。怎么做到的?

请注意,如果您继续长按单元格而不拖动,则拖动将在大约 2 秒后取消。我只是想在识别出长按手势后立即取消它,这样用户就不必等待。

UICollectionView 有一个 属性 hasActiveDrag 来指示该状态,但我没有看到取消它的方法。我确实尝试将 dragInteractionEnabled 设置为 false,然后再次设置 true,希望这样可以取消它,但它仍然处于活动状态。我什至尝试在正在拖动的索引路径处重新加载单元格,但这也没有取消它。

我整理了一些Sample Project你可以运行看看这里发生了什么。

如果您查看集合视图上的识别器,您会发现一个 _UIDragLiftGestureRecognizer,它可用于通过设置 enabled = NO 来取消拖放识别。