web-dev-qa-db-ja.com

パンジェスチャ終了の検出

ビューがあり、このビューにUIPanGestureRecogniserを適用しました。

UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panAnim:)];
[sliderView addGestureRecognizer:panGesture];
[panGesture release];

ジェスチャーをうまく検出して処理できます。ただし、ジェスチャが終了したら、別の方法を開始したいと思います。

この種の検出を可能にする2つの方法があることを知っています。 touchesEndedtouchesCancelledただし、タッチがジェスチャになるとすぐにtouchesCancelledが呼び出されることがわかりました。つまり、ジェスチャ呼び出しとtouchesEndedは、まれにしか呼び出されません。

左/右にパンし、ジェスチャーの終了時に別の関数呼び出しを開始できるようにします。どうすればいいですか?

46
Dan Hanly

パンジェスチャ終了イベントは、UIGestureRecognizerStateEndedで状態を確認することで検出できます。

以下のコードで確認してください。

-(void) panAnim:(UIPanGestureRecognizer*) gestureRecognizer
{
   if(gestureRecognizer.state == UIGestureRecognizerStateEnded)
   {
      //All fingers are lifted.
   }
}

From Apple documentation

パン操作は継続的です。許可される最小指数(minimumNumberOfTouches)がパンと見なされるのに十分に移動したときに開始します(UIGestureRecognizerStateBegan)。少なくとも最小数の指が押されている間に指が動くと、変化します(UIGestureRecognizerStateChanged)。すべての指を離すと終了します(UIGestureRecognizerStateEnded)。

IPanGestureRecognizerの詳細を読む

131
Jhaliya

パンジェスチャ終了イベントは、UIGestureRecognizerStateEndedまたはUIGestureRecognizerStateCancelledまたはUIGestureRecognizerStateFailedで状態を確認することで検出できます。

以下のコードで確認してください。

   -(void) panGesture:(UIPanGestureRecognizer*) gestureRecognizer
    {
     if(gestureRecognizer.state == UIGestureRecognizerStateEnded || gestureRecognizer.state == UIGestureRecognizerStateFailed || gestureRecognizer.state == UIGestureRecognizerStateCancelled)
             {
                //code what you want.
             }
     }
11
Waseem Shah

上記の答えはすべて正しいです。これはSwiftの更新されたものです。

スウィフト3:

func panGesture(recognizer: UIPanGestureRecognizer) {
    if recognizer.state == .ended {
        // Do what you want
    }
}
6
Ray Tso

Swift 4では、UIGestureRecognizerState.endedを使用します。

例えば.

if (gestureRecognizer.state == UIGestureRecognizerState.ended) {

        //Move label back to original position (function invoked when gesture stops)
        UIView.animate(withDuration: 0.4) {
            self.swipeLabel.center = CGPoint(x: self.view.bounds.width / 2, y: self.view.bounds.height / 2)
        }
    }

以下は、ジェスチャーが終了したときを含め、ジェスチャーでUILabelをアニメーション化するためにView Controllerで必要なすべてのコードです。

import UIKit

class ViewController: UIViewController {

@IBOutlet weak var swipeLabel: UILabel!

override func viewDidLoad() {
    super.viewDidLoad()

    //Create gesture
    let gestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(moveLabelBasedOn(gestureRecognizer:)))

    //Assign gesture to UILabel
    swipeLabel.addGestureRecognizer(gestureRecognizer)

}

//Animate Label in Resopnse to Gesture
@objc func moveLabelBasedOn(gestureRecognizer: UIPanGestureRecognizer) {

    let changeInPosition = gestureRecognizer.translation(in: view)

    //Move label in response to gesture
    swipeLabel.center = CGPoint(x: view.bounds.width / 2 + changeInPosition.x, y: view.bounds.height / 2 + changeInPosition.y)

    //Check if gesture ended
    if (gestureRecognizer.state == UIGestureRecognizerState.ended) {

        //Move label back to original position (function invoked when gesture stops)
        UIView.animate(withDuration: 0.4) {
            self.swipeLabel.center = CGPoint(x: self.view.bounds.width / 2, y: self.view.bounds.height / 2)
        }
    }
}

}

お役に立てれば。

1
Douglas Putnam

これは、2本(またはそれ以上)の指パンでは機能しません。 numberOfMinimumTouches = 2の場合、パンが開始され、スクロール/パンできますが、1本の指を持ち上げても、パンは継続します(2本の指の間ではなく1本の指の位置に移動します)。 State.endedは、[〜#〜] all [〜#〜]指を離したときのみであるためです。 numberOfMinimumTouches値に基づいて停止するには、別のアプローチを実装する必要があります。

0
user3577199