检测手势结束时的拖动手势

62

我有一个视图,并给该视图添加了一个UIPanGestureRecogniser手势识别器:

UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panAnim:)];
[sliderView addGestureRecognizer:panGesture];
[panGesture release];
我可以很好地检测和处理手势。然而,我希望在手势结束后启动另一个方法。
我知道有两种方法可以进行这种检测:touchesEndedtouchesCancelled,但是我发现 touchesCancelled 在触摸变成手势即移动手指足够多的时候就会被调用,而 touchesEnded 很少甚至从不被调用。
我想能够左 / 右滑动,然后在手势结束后启动另一个函数调用。我该如何做到这一点?
5个回答

154

通过检查手势的状态 UIGestureRecognizerStateEnded 来检测平移手势结束事件。

使用以下代码进行检查。

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

来自苹果文档

拖动手势是连续的。当允许的最小手指数(minimumNumberOfTouches)已经移动足够到被视为拖动时,它就开始了(UIGestureRecognizerStateBegan)。当至少有最小手指数按下并且手指移动时,它会发生变化(UIGestureRecognizerStateChanged)。当所有手指都离开时,它将结束(UIGestureRecognizerStateEnded)。

阅读更多关于UIPanGestureRecognizer的信息


@Daniel Hanly:很高兴知道它对你有帮助 :) - Jhaliya - Praveen Sharma
对于Swift 5及以上版本,应该使用gestureRecognizer.state == .endedgestureRecognizer.state == UIPanGestureRecognizer.State.ended - Wimukthi Rajapaksha

11

通过检查其状态,可以检测到平移手势结束事件,使用 UIGestureRecognizerStateEndedUIGestureRecognizerStateCancelledUIGestureRecognizerStateFailed 进行检查。

使用以下代码进行检查。

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

9
以上答案都是正确的,这里提供一份更新的Swift 3版本。 Swift 3:
func panGesture(recognizer: UIPanGestureRecognizer) {
    if recognizer.state == .ended {
        // Do what you want
    }
}

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

}

希望这有所帮助。

1

这种方法对于两个或更多手指的滑动无效。在这种情况下,使用 numberOfMinimumTouches = 2,可以开始滚动/平移,但是如果您抬起一个手指,平移仍将继续(移动到一个手指所在的位置而不是两个手指之间),因为State.ended只有在所有手指都离开时才会触发。要根据numberOfMinimumTouches值停止,请实现不同的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接