我有一个视图,它有一个LongPressGestureRecognizer
分配给它调用以下方法:
@IBAction func longPressOnView1Recognized(_ sender: UIGestureRecognizer) {
if sender.state == .began {
// this runs when user's finger is down a "long time"
}
if sender.state == .ended {
// this runs when user's finger goes up again after the .began state
}
}
字符串
这一切都像预期的那样工作,但是我试图找到一种(好的/适当的)方法,能够在用户手指仍然按下时以编程方式cancel
长按识别器(在某些情况下)。
也就是说,当用户的手指仍然按在视图上,并且识别器已经进入. begin状态时,(但在用户抬起手指之前--在识别器进入.ended状态之前).是否有一些代码我们可以运行,将防止上述方法从触发时,用户抬起他们的手指.像过早地告诉IOS不再监听UP事件为这一姿态的其余部分?
我读过这些docs,但我没有那么多的经验与IOS触摸,我似乎找不到任何方法,是专为这一目的。
我的GestureRecognizer.reset()
似乎没有做我所描述的。
我能想到两种可能性:
1)一个布尔标志,它将进入if sender.state == .ended {}
闭包中。
2)这一点:
myLongPressRecognizer.isEnabled = false
myLongPressRecognizer.isEnabled = true
型
这两种方法都有效,但似乎并不那么好。
4条答案
按热度按时间fjnneemd1#
你们都很擅长禁用和重新启用手势识别器,
字符串
完全正确
我担心的是你没有完全理解手势识别器。在处理手势识别器时,你应该总是使用switch语句。查看评论:
型
所以至少你应该处理取消状态。但也要注意,每当手势移动时,更改的状态将被触发。
j2qf4p5b2#
现在,
state
是可变的。所以只要将state
设置为.cancelled
,手势就会被取消。标题表明它仍然是get
唯一的属性,但实际上,它实际上是可变的。他们必须将UIKit.UIGestureRecognizer
的导入(下面讨论)作为更广泛的import UIKit
的一部分。在以前的iOS版本中,
state
是不可变的,并且显式导入手势识别器头以使手势可取消:字符串
这会使原本不可变的
state
属性变成一个可读写属性,但现在已经不需要了。w46czmvw3#
您已经有了解决方案。切换
UILongPressGestureRecognizer
isEnabled
是最好的方法。设置state
属性是不可能的,因为它是一个只获取属性。字符串
isEnabled
属性记录为:默认值是YES。禁用的手势识别器将不会接收触摸。当更改为NO时,如果手势识别器当前正在识别手势,则将取消手势识别器。
disbfnqx4#
OP问题的正确答案要简单得多,只需调用:
字符串
每当你想取消一个活动的手势。不需要切换布尔值的打开和关闭。