如何判断捏合手势结束(UIGestureRecognizer)?

10

我希望在我的UIPinchGestureRecognizer完成缩放手势时得到一个回调。并且最好知道缩放手势是放大还是缩小。

有人知道可以使用的方法吗?或者实现这个功能的途径是什么?

谢谢!

4个回答

14

除了覆盖touchesEnded:方法的另一种方法是,在目标处理程序方法中只需检查手势识别器的状态即可。

  -(void)handlePinchGesture:(UIGestureRecognizer*)gestureRecognizer {    
    if(UIGestureRecognizerStateEnded == [gestureRecognizer state]){
      // do something
    }
  }

谢谢!这样更好 ;) - Lars Petersen

1

通过UIPinchGestureRecognizer的比例属性,您可以知道它是放大还是缩小。

只需覆盖它的touchesEnded:方法以获取回调(如果需要,可以调用其他方法)。


0
最好的方法是不需要子类化,而是在您的操作处理程序中检查手势识别实例上的“state”属性。状态将在手势的生命周期的所有阶段发生变化。您要寻找的状态更改是UIGestureRecognizerStateEnded。同时,检查UIGestureRecognizerStateCancelled也是一个好习惯。

0

由于某种原因,在我的设备上进行测试时,我并没有始终收到捏合手势识别器状态为.ended的结果。我偶尔能够触发一次,但它非常不一致。

(我想知道这是否是因为我将捏合手势识别器附加到了一个UICollectionView,但我还没有尝试用其他视图来确认。因此,我认为重写touchesEnded不是一个可考虑的解决方案,因为其他触摸事件/手势也在使用中。)

我能够进行的最一致的检查是确认手势识别器上的触摸点数量

假设您已经将捏合手势识别器附加到一个视图上:

let pinchGesture = UIPinchGestureRecognizer(target: self, action: #selector(didReceivePinchGesture))
yourView.addGestureRecognizer(pinchGesture)

在处理程序中,我检查触摸的数量以确保它是一个捏合手势。如果不是两个触摸,则可以推断这是手势的结束:

@objc func didReceivePinchGesture(_ gestureRecognizer: UIPinchGestureRecognizer) {
    guard gestureRecognizer.numberOfTouches == 2 else {
        // Logic for pinch gesture ended
        return
    }

    if gestureRecognizer.state == .began {
        ...
    } else if gestureRecognizer.state == .changed {
        ...
    } else {
        // Same logic for pinch gesture ended (though rarely invoked)
    }
}

警告:当进行测试时,就像如果你在不同的毫秒内没有同时抬起手指,.ended状态就不会被触发一样,似乎即使只有一个触摸在开始时,手势识别器也会被调用,如果你的手指在屏幕上触摸的时间不完全相同。

我明确地在状态等于.began时开始处理手势的逻辑,所以这对我的逻辑没有任何负面影响。然而,根据你想要实现的目标,这可能是一个问题。


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