2017-07-19 101 views
2

我已實現UICollectionViewDragDelegate以允許用戶拖放收集視圖單元格。我也有一個UILongPressGestureRecognizer添加到每個單元格。長時間按下單元格後,在長按手勢狀態開始之前識別拖動交互。如果拖動它,則取消長按手勢。這工作得很好。取消UICollectionView中的活動拖動

但是爲了使這兩個更好地結合在一起,當識別長按手勢時(state == .began),我想以編程方式取消正在進行的拖動會話 - 取消它,就好像用戶鬆開手指導致單元不再是拖動,但繼續認識到長按手勢。否則,拖動和長按動作都會被激活,在我的情況下效果不佳 - 一次或另一次需要激活。如何做到這一點?

請注意,如果您繼續長時間不拖拉地按住單元格,大約2秒鐘後,拖動將會取消。我只是想在長按手勢被識別後立即取消,以便用戶不必等待。

UICollectionView有一個屬性hasActiveDrag來表明狀態,但我沒有看到一種方法來取消它。我曾嘗試將dragInteractionEnabled設置爲false,然後再次true希望能取消它,但它仍保持活動狀態。我甚至試圖在被拖動的索引路徑上重新加載單元格,但也沒有取消它。

我已經放在一起Sample Project你可以運行,看看這裏發生了什麼。

回答

2

如果您查看收集視圖中的識別器,您會發現一個_UIDragLiftGestureRecognizer,可用於通過設置enabled = NO來取消拖放識別。