swift 如何取消LongPressGestureRecognizer?

cczfrluj  于 5个月前  发布在  Swift
关注(0)|答案(4)|浏览(36)

我有一个视图,它有一个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


这两种方法都有效,但似乎并不那么好。

fjnneemd

fjnneemd1#

你们都很擅长禁用和重新启用手势识别器,

myLongPressRecognizer.isEnabled = false
myLongPressRecognizer.isEnabled = true

字符串
完全正确
我担心的是你没有完全理解手势识别器。在处理手势识别器时,你应该总是使用switch语句。查看评论:

func handleLongPressGestureRecognizer(_ sender: UIGestureRecognizer) {

    switch sender.state {
    case .began:
        // This will be called only once when the gesture starts
        print("Long press did begin at \(sender.location(in: sender.view))")
    case .changed:
        // This will be called whenever your finger moves (at some frequency obviously).
        // At this point your long press gesture is acting exactly the same as pan gesture
        print("Long press changed position to \(sender.location(in: sender.view))")
    case .ended:
        // This is when user lifts his finger assuming the gesture was not canceled
        print("Long press ended at \(sender.location(in: sender.view))")
    case .cancelled:
        // This is equally important as .ended case. You gesture may be canceled for many reasons like a system gesture overriding it. Make sure to implement logic here as well.
        print("Long press canceled at \(sender.location(in: sender.view))")
    case .failed, .possible:
        // These 2 have been added additionally at some point. Useless as far I am concerned.
        break
    }

}


所以至少你应该处理取消状态。但也要注意,每当手势移动时,更改的状态将被触发。

j2qf4p5b

j2qf4p5b2#

现在,state是可变的。所以只要将state设置为.cancelled,手势就会被取消。标题表明它仍然是get唯一的属性,但实际上,它实际上是可变的。他们必须将UIKit.UIGestureRecognizer的导入(下面讨论)作为更广泛的import UIKit的一部分。
在以前的iOS版本中,state是不可变的,并且显式导入手势识别器头以使手势可取消:

import UIKit.UIGestureRecognizer

字符串
这会使原本不可变的state属性变成一个可读写属性,但现在已经不需要了。

w46czmvw

w46czmvw3#

您已经有了解决方案。切换UILongPressGestureRecognizerisEnabled是最好的方法。设置state属性是不可能的,因为它是一个只获取属性。

open var state: UIGestureRecognizer.State { get } // the current state of the gesture recognizer

字符串
isEnabled属性记录为:
默认值是YES。禁用的手势识别器将不会接收触摸。当更改为NO时,如果手势识别器当前正在识别手势,则将取消手势识别器。

disbfnqx

disbfnqx4#

OP问题的正确答案要简单得多,只需调用:

gesture.state = .cancelled

字符串
每当你想取消一个活动的手势。不需要切换布尔值的打开和关闭。

相关问题