我想在我的 UIPinchGestureRecognizer 完成捏合手势时收到回调。此外,如果知道完成的手势是放大还是缩小,那就太好了。
有人知道使用方法吗?或者采取什么方法?
谢谢!
另一种方法,而不是重写touchesEnded:,是您可以在目标处理程序方法中检查手势识别器的状态。
-(void)handlePinchGesture:(UIGestureRecognizer*)gestureRecognizer {
if(UIGestureRecognizerStateEnded == [gestureRecognizer state]){
// do something
}
}
可以通过UIPinchGestureRecognizer的scale属性知道是放大还是缩小。
只需重写它的 TouchsEnded: 方法即可获取回调(如果您愿意,还可以调用其他方法)。
不需要子类化的最佳方法是检查动作处理程序中手势识别实例的“状态”属性。状态将在手势生命周期的所有阶段发生变化。您正在寻找的状态更改是 UIGestureRecognizerStateEnded。检查 UIGestureRecognizerStateCancelled 也是一个很好的做法。
由于某种原因,在我的设备上进行测试时,我并未始终收到
.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
时,我有明确的逻辑开始处理手势,因此这对我的逻辑没有任何负面影响。然而,根据您想要实现的目标,这可能是您所关心的问题。