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?
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.
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.
}
}
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
}
}
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.
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.