2017-07-19 47 views
2

我已实现UICollectionViewDragDelegate以允许用户拖放收集视图单元格。我也有一个UILongPressGestureRecognizer添加到每个单元格。长时间按下单元格后,在长按手势状态开始之前识别拖动交互。如果拖动它,则取消长按手势。这工作得很好。取消UICollectionView中的活动拖动

但是为了使这两个更好地结合在一起,当识别长按手势时(state == .began),我想以编程方式取消正在进行的拖动会话 - 取消它,就好像用户松开手指导致单元不再是拖动,但继续认识到长按手势。否则,拖动和长按动作都会被激活,在我的情况下效果不佳 - 一次或另一次需要激活。如何做到这一点?

请注意,如果您继续长时间不拖拉地按住单元格,大约2秒钟后,拖动将会取消。我只是想在长按手势被识别后立即取消,以便用户不必等待。

UICollectionView有一个属性hasActiveDrag来表明状态,但我没有看到一种方法来取消它。我曾尝试将dragInteractionEnabled设置为false,然后再次true希望能取消它,但它仍保持活动状态。我甚至试图在被拖动的索引路径上重新加载单元格,但也没有取消它。

我已经放在一起Sample Project你可以运行,看看这里发生了什么。

回答

2

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