web-dev-qa-db-fra.com

Détection de la fin du geste de panoramique

J'ai une vue et j'ai appliqué un UIPanGestureRecogniser à cette vue:

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

Je peux très bien détecter et traiter le geste. Cependant, je souhaite initier une autre méthode une fois le geste terminé.

Je sais qu'il existe deux méthodes permettant ce type de détection. touchesEnded et touchesCancelled cependant, j’ai trouvé que touchesCancelled est appelé dès que le toucher devient un geste, c’est-à-dire que je bouge mon doigt assez pour justifier un appel de geste et que touchesEnded est appelé rarement.

Je veux pouvoir effectuer un panoramique gauche/droite puis initier un autre appel de fonction à la fin du geste. Comment puis-je faire cela?

45
Dan Hanly

L'événement de fin de mouvement de panoramique peut être détecté en vérifiant son état avec UIGestureRecognizerStateEnded.

Vérifiez avec le code ci-dessous.

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

De la documentation Apple

Un geste panoramique est continu. Il commence (UIGestureRecognizerStateBegan) quand le nombre minimum de doigts autorisé (minimumNumberOfTouches) a déplacé assez pour être considéré comme un pan . Ça change (UIGestureRecognizerStateChanged) quand un doigt bouge pendant qu'au moins le nombre minimum de doigts sont pressés vers le bas. Il se termine (UIGestureRecognizerStateEnded) quand tous les doigts sont levés.

Lire la suite

127
Jhaliya

L'événement de fin de mouvement de panoramique peut être détecté en vérifiant son état avec UIGestureRecognizerStateEnded ou UIGestureRecognizerStateCancelled ou UIGestureRecognizerStateFailed

Vérifiez avec le code ci-dessous.

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

Les réponses ci-dessus sont correctes, il s’agit d’une mise à jour pour Swift.

Swift 3:

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

Dans Swift 4, utilisez UIGestureRecognizerState.ended.

par exemple. 

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)
        }
    }

Vous trouverez ci-dessous tout le code dont vous avez besoin dans un contrôleur de vue pour animer un UILabel avec un geste, y compris à la fin du geste.

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)
        }
    }
}

}

J'espère que cela t'aides.

1
Douglas Putnam

Cela ne fonctionnerait pas pour un panoramique à deux (ou plus). Dans ce cas avec numberOfMinimumTouches = 2, le panoramique commencerait et vous pouvez faire défiler/déplacer, mais si vous levez un doigt, le panoramique continuera toujours puisque le State.ended est seulement quandTOUSdoigts sont levés. Pour arrêter en fonction de la valeur numberOfMinimumTouches, une approche différente doit être mise en œuvre.

0
user3577199