Подтвердить что ты не робот

Обнаружение конца жесты панорамы

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Узнайте больше о UIPanGestureRecognizer

Ответ 2

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

Проверьте приведенный ниже код.

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

Ответ 3

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

Swift 3:

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

Ответ 4

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

}

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

Ответ 5

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