检测平移手势结束

时间:2011-06-24 12:13:54

标签: objective-c touch uigesturerecognizer

我有一个视图,我在这个视图中应用了一个UIPanGestureRecogniser:

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

我可以很好地检测和处理手势。但是,一旦手势结束,我希望启动另一种方法。

我知道有两种方法可以进行这种检测。 touchesEndedtouchesCancelled但是,我发现只要触摸成为手势就会调用touchesCancelled,即我移动手指足以保证手势调用touchesEnded很少,如果有的话,被召唤。

我希望能够向左/向右平移,然后在手势结束时启动另一个函数调用。我该怎么做?

5 个答案:

答案 0 :(得分:129)

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

请查看以下代码。

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

来自Apple文档

  

平移手势是连续的。它   开始(UIGestureRecognizerStateBegan)   当最小手指数   允许(minimumNumberOfTouches)有   移动到足以被视为一个平底锅。   它改变   (UIGestureRecognizerStateChanged)时   一个手指至少移动了   按下最小手指数   下。它结束了   (UIGestureRecognizerStateEnded)时   所有的手指都被抬起。

Read more about UIPanGestureRecognizer

答案 1 :(得分:11)

通过UIGestureRecognizerStateEndedUIGestureRecognizerStateCancelledUIGestureRecognizerStateFailed

检查其状态,可以检测到平移手势结束事件

请查看以下代码。

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

答案 2 :(得分:6)

以上答案都是正确的,这只是Swift的更新版本。

斯威夫特3:

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

答案 3 :(得分:1)

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

}

希望这会有所帮助。

答案 4 :(得分:0)

这不适用于两个(或更多个)手指平底锅。在这种情况下,使用numberOfMinimumTouches = 2,平移将开始,并且您可以滚动/平移,但是如果您抬起一根手指,平移仍将继续(移动到一个手指而不是两个手指之间的位置),因为State.ended仅在 ALL 手指被松开时使用。要基于numberOfMinimumTouches值停止,需要采用其他方法。