根据Apple文档的说明,捏是连续的手势,意味着必须用两只手指使用。即使用三根手指捏合,在Swift 4.1中也能正常工作。
我尝试打印触摸次数。即使使用三个手指,触摸的次数仍为2。看来它检测到前2个手指触摸而忽略了第三个手指。因此无法过滤。
@objc func pinch(pinchGesture: UIPinchGestureRecognizer){
if pinchGesture.state == UIGestureRecognizerState.began {
print("number of touches:\(pinchGesture.numberOfTouches)")
}
}
我在viewDidLoad中调用setupGesture()方法。因此,它可以处理相关的用户捏合手势。
func setupGestures(){
let pinch = UIPinchGestureRecognizer(target: self, action: #selector(self.pinch))
pinch.delegate = self
self.addGestureRecognizer(pinch)
}
有什么可能的方法来避免在iOS中捏三个手指?
答案 0 :(得分:1)
您可以过滤触摸:
func touchesBegan(_ touches: Set<UITouch>,
with event: UIEvent)
例如,从参数touches
获取触摸次数,如果touches.count > 2
则不对该手势进行操作-忽略它。
编辑(1):
编辑后,我有另一个主意(我没有Mac,所以现在无法尝试)。尝试使用委托中的this method。在接受之前,您应该能够取得联系。我看不到该信息是否被调用一次,或者每次触摸(每个手指)一次被调用的信息。也许您可以通过某种方式使用它?
答案 1 :(得分:0)
最近我想出了解决此问题的方法,这可能不是最佳解决方案,也可以是替代方法。但这有效。
这里我只保留一个布尔值
var numberOfAllTouchesLessThanOrEqualsToTwo = false
我使用事件处理程序来设置布尔值。
override func touchesBegan(_ touches: Set<UITouch>,with event: UIEvent?){
if (event?.allTouches?.count)! > 2 {
numberOfAllTouchesLessThanOrEqualsToTwo = false
}else{
numberOfAllTouchesLessThanOrEqualsToTwo = true
}
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
if (event?.allTouches?.count)! > 2 {
numberOfAllTouchesLessThanOrEqualsToTwo = false
}else{
numberOfAllTouchesLessThanOrEqualsToTwo = true
}
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
if (event?.allTouches?.count)! > 2 {
numberOfAllTouchesLessThanOrEqualsToTwo = false
}else{
numberOfAllTouchesLessThanOrEqualsToTwo = true
}
}
并且我使用了此布尔型内部手势识别器。
@objc func pinch(pinchGesture: UIPinchGestureRecognizer){
if pinchGesture.state == UIGestureRecognizerState.changed {
if numberOfAllTouchesLessThanOrEqualsToTwo {
//code
}
}
}
有效。