在 Swift 中以编程方式启动手势识别器?

Posted

技术标签:

【中文标题】在 Swift 中以编程方式启动手势识别器?【英文标题】:Programmatically Starting Gesture Recognizer In Swift? 【发布时间】:2016-05-17 14:47:13 【问题描述】:

我正在尝试确定是否有一种以编程方式设置手势识别器状态的方法,以强制它在实际检测到用户输入之前开始。

例如,当检测到长按时,我正在向图像添加一个平移手势识别器,如下所示;

let longPressRecognizer = UILongPressGestureRecognizer(target: self, action: "longPressed:")
myImage.addGestureRecognizer(longPressRecognizer)

func longPressed(sender: UILongPressGestureRecognizer) 

   let mainWidth = UIScreen.mainScreen().bounds.width
   let mainHeight = UIScreen.mainScreen().bounds.height

   let myView: UIView(frame: CGRect(x: 0, y: 0, width: mainWidth, height: mainHeight)

   let gestureRecognizer = UIPanGestureRecognizer(target: self, action: "handlePan:")
   myView.addGestureRecognizer(gestureRecognizer)

   self.view.addSubview(myView)


handlePan() 函数中,我可以确定平移的开始和结束时间;

func handlePan(gesture: UIPanGestureRecognizer) 

    if gesture!.state == UIGestureRecognizerState.Began 
        print("Started pan")
    

    if gesture!.state == UIGestureRecognizerState.Ended 
        print("Ended pan")
    


我的问题是,要检测手势何时开始,用户必须 (1) 长按图像,(2) 松开手指,(3) 按住并开始平移。理想情况下,我希望用户 (1) 长按图像,(2) 开始平移。

为了实现这一点,我想我需要找到一种方法来“欺骗”事情,让他们相信平移手势已经开始。

注意:实际上,比这里介绍的要复杂得多,这就是为什么我需要添加带有平移手势的子视图,而不是直接将平移手势添加到图像。

【问题讨论】:

您能否将触摸设为“Touch Down”事件而不是“Touch Up Inside”事件。这样您就不需要松开手指来发送事件了。 【参考方案1】:

您要做的是预先添加两个手势识别,将它们的代表设置为您的类,允许它们同时识别(使用下面的方法),并且仅在长按成功后才使用平移中的数据认可。

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer,
    shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool 
    return true
 

【讨论】:

以上是关于在 Swift 中以编程方式启动手势识别器?的主要内容,如果未能解决你的问题,请参考以下文章

取消手势识别器后以编程方式启动 hitTest:WithEvent 并返回不同的 UIView 以响应事件

如何使用 Swift XCUITest 添加摇晃手势? [关闭]

基于STM32的手势识别检测

手势识别基于matlab GUI SIFT+SVM算法手势识别含Matlab源码 1789期

以编程方式添加视图和手势 - “发送到实例的无法识别的选择器”

如何以编程方式触发 UIView 的点击手势识别器