如何知道捏合手势何时完成(UIGestureRecognizer)

问题描述 投票:0回答:4

我想在我的 UIPinchGestureRecognizer 完成捏合手势时收到回调。此外,如果知道完成的手势是放大还是缩小,那就太好了。

有人知道使用方法吗?或者采取什么方法?

谢谢!

iphone uigesturerecognizer pinch
4个回答
14
投票

另一种方法,而不是重写touchesEnded:,是您可以在目标处理程序方法中检查手势识别器的状态。

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

1
投票

可以通过UIPinchGestureRecognizer的scale属性知道是放大还是缩小。

只需重写它的 TouchsEnded: 方法即可获取回调(如果您愿意,还可以调用其他方法)。


0
投票

不需要子类化的最佳方法是检查动作处理程序中手势识别实例的“状态”属性。状态将在手势生命周期的所有阶段发生变化。您正在寻找的状态更改是 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
时,我有明确的逻辑开始处理手势,因此这对我的逻辑没有任何负面影响。然而,根据您想要实现的目标,这可能是您所关心的问题。

© www.soinside.com 2019 - 2024. All rights reserved.