Обнаружение окончания жеста Pan - PullRequest
46 голосов
/ 24 июня 2011

У меня есть представление, и я применил к нему представление UIPanGestureRecogniser:

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

Я могу очень хорошо обнаруживать и обрабатывать жест.Тем не менее, я хочу инициировать другой метод, как только жест закончится.

Я знаю, что есть два метода, которые позволяют такое обнаружение.touchesEnded и touchesCancelled однако я обнаружил, что touchesCancelled вызывается, как только касание становится жестом, т.е. я достаточно двигаю пальцем, чтобы оправдать вызов жестом, и touchesEnded редко, если вообще когда-либо, вызывается.

Я хочу иметь возможность панорамирования влево / вправо, а затем инициировать другой вызов функции по окончании жеста.Как мне это сделать?

Ответы [ 5 ]

129 голосов
/ 24 июня 2011

Событие окончания жеста панорамирования можно обнаружить, проверив его состояние с помощью UIGestureRecognizerStateEnded.

Проверьте с помощью приведенного ниже кода.

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

Из документации Apple

Жест панорамирования является непрерывным.Он начинается (UIGestureRecognizerStateBegan), когда минимально допустимое количество пальцев (минимальное количество пальцев) достаточно переместилось, чтобы считаться панорамированием.Он изменяется (UIGestureRecognizerStateChanged), когда палец двигается, когда нажата по крайней мере минимальное количество пальцев.Он заканчивается (UIGestureRecognizerStateEnded), когда все пальцы подняты.

Подробнее о UIPanGestureRecognizer

11 голосов
/ 03 октября 2013

Событие окончания жеста панорамирования можно обнаружить, проверив его состояние с помощью UIGestureRecognizerStateEnded или UIGestureRecognizerStateCancelled или UIGestureRecognizerStateFailed

Проверьте с помощью приведенного ниже кода.

   -(void) panGesture:(UIPanGestureRecognizer*) gestureRecognizer
    {
     if(gestureRecognizer.state == UIGestureRecognizerStateEnded || gestureRecognizer.state == UIGestureRecognizerStateFailed || gestureRecognizer.state == UIGestureRecognizerStateCancelled)
             {
                //code what you want.
             }
     }
6 голосов
/ 13 марта 2017

Над ответами все верны, это только обновленный ответ для Swift.

Swift 3:

func panGesture(recognizer: UIPanGestureRecognizer) {
    if recognizer.state == .ended {
        // Do what you want
    }
}
1 голос
/ 25 июля 2018

В 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 с помощью жеста, в том числе после его окончания.

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

}

Надеюсь, это поможет.

0 голосов
/ 19 января 2019

Это не будет работать для двух (или более) панорамирования. В этом случае при numberOfMinimumTouches = 2 начнется панорамирование, и вы сможете прокручивать / панорамировать, но если вы поднимите один палец, панорамирование все равно продолжится (переместитесь туда, где находится один палец, а не между двумя пальцами), поскольку State.ended - это только когда ALL пальцы подняты. Чтобы остановиться на основе значения numberOfMinimumTouches, необходимо реализовать другой подход.

...