2016-10-04 4 views
0

アイテムのドラッグを有効にしたUICollectionViewがあります。しかし、私はまた、アイテムのタップを検出することができる必要があります。タップを検出するだけでなく、セルをドラッグする

タップ検出するために、私は単純にドラッグを検出するために

didSelectItemAtIndex

を使用し、私はcollectionViewにUILongPressGestureRecognizerを追加し、その長押しの場所からセルを見つけました:

longPressGesture = UILongPressGestureRecognizer(target: self, action: #selector(OrganizeWidgetsViewController.handleLongGesture(gesture:))) 
    longPressGesture.numberOfTapsRequired = 0 
    longPressGesture.minimumPressDuration = 0.01 
    widgetCollectionView.addGestureRecognizer(longPressGesture) 

問題ユーザーの指が画面に触れてドラッグを開始するとすぐにドラッグする必要があるということです。しかし、私のlongPressGestrueの最小minimumPressDuration(0.01)は、タップが検出されないようにします。

私のlongPressGestureが検出されましたが、通常はタップは検出されません。タッピングを検出し、セルのドラッグを有効にするより良い方法はありますか?

+0

最小継続時間を長くすると、私はユーザーがいつも長い時間lilを押して通常のタップを押すとドラッグが起きると予想します。 –

答えて

1

longPressGesture.minimumPressDurationを0に設定して解決し、ユーザーがタップの原点からドラッグした距離を確認します。

ドラッグの最大距離が原点から一定量以上離れている場合はドラッグとして認識します。そうではありません。

ステップ1: collectionViewにlongPressGestureを実装:

longPressGesture = UILongPressGestureRecognizer(target: self, action: #selector(MyViewController.handleLongGesture(gesture:))) 
    longPressGesture.numberOfTapsRequired = 0 
    longPressGesture.minimumPressDuration = 0 
    myCollectionView.addGestureRecognizer(longPressGesture) 

ステップ2:ドラッグの距離

var startPoint: CGPoint? 
var maxDistance: CGFloat? 

ステップを計算するクラスの2つの変数を宣言し3ドラッグの起点からの距離の合計を計算する関数を記述します(このメソッドは、次のステップ)

func calculateDistance(from: CGPoint, to: CGPoint) -> CGFloat { 
     return sqrt(pow((from.x - to.x),2) + pow((from.y - to.y),2)) 
} 

ステップ4:ドラッグ

func handleLongGesture(gesture: UILongPressGestureRecognizer) { 
    switch(gesture.state) { 
    case UIGestureRecognizerState.began: 
     startPoint = gesture.location(in: myCollectionView) 
     maxDistance = 0 
     guard let selectedIndexPath = myCollectionView.indexPathForItem(at: gesture.location(in: myCollectionView)) else { 
      break 
     } 
     myCollectionView.beginInteractiveMovementForItem(at: selectedIndexPath) 

    case UIGestureRecognizerState.changed: 
     maxDistance = max(maxDistance!, calculateDistance(from: startPoint!, to: gesture.location(in: myCollectionView))) 
     myCollectionView.updateInteractiveMovementTargetPosition(gesture.location(in: gesture.view!)) 
    case UIGestureRecognizerState.ended: 
     if maxDistance! < CGFloat(10) { 
      if let selectedIndexPath = myCollectionView.indexPathForItem(at: gesture.location(in: myCollectionView)) { 
       collectionView(myCollectionView, didSelectItemAt: selectedIndexPath) 
      } 
     } 
     myCollectionView.endInteractiveMovement() 

    default: 
     myCollectionView.cancelInteractiveMovement() 
    } 
} 

注ハンドル:私たちは、あなたが発生することが好きな機能を確認して、ステップ4の中から私たちのcollectionViewにdidSelectItemAtIndexを呼び出す をそこにはタップで行く。

関連する問題