我有一个视图,我在这个视图中应用了一个UIPanGestureRecogniser:
UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panAnim:)];
[sliderView addGestureRecognizer:panGesture];
[panGesture release];
我可以很好地检测和处理手势。但是,一旦手势结束,我希望启动另一种方法。
我知道有两种方法可以进行这种检测。 touchesEnded
和touchesCancelled
但是,我发现只要触摸成为手势就会调用touchesCancelled
,即我移动手指足以保证手势调用touchesEnded
很少,如果有的话,被召唤。
我希望能够向左/向右平移,然后在手势结束时启动另一个函数调用。我该怎么做?
答案 0 :(得分:129)
可以通过UIGestureRecognizerStateEnded
检查其状态来检测平移手势结束事件。
请查看以下代码。
-(void) panAnim:(UIPanGestureRecognizer*) gestureRecognizer
{
if(gestureRecognizer.state == UIGestureRecognizerStateEnded)
{
//All fingers are lifted.
}
}
来自Apple文档
平移手势是连续的。它 开始(UIGestureRecognizerStateBegan) 当最小手指数 允许(minimumNumberOfTouches)有 移动到足以被视为一个平底锅。 它改变 (UIGestureRecognizerStateChanged)时 一个手指至少移动了 按下最小手指数 下。它结束了 (UIGestureRecognizerStateEnded)时 所有的手指都被抬起。
答案 1 :(得分:11)
通过UIGestureRecognizerStateEnded
或UIGestureRecognizerStateCancelled
或UIGestureRecognizerStateFailed
请查看以下代码。
-(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
值停止,需要采用其他方法。