ios – 如何在touchesBegan方法中发生双击时防止单击被调用

ios – 如何在touchesBegan方法中发生双击时防止单击被调用,第1张

概述我已经实现了单击和双击.但每当我双击屏幕时,也会运行单击代码.请参阅以下代码: override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { let touch = touches.first as UITouch! let touchLocation = touch?.location(in 我已经实现了单击和双击.但每当我双击屏幕时,也会运行单击代码.请参阅以下代码:

overrIDe func touchesBegan(_ touches: Set<UItouch>,with event: UIEvent?) {    let touch = touches.first as UItouch!    let touchLocation = touch?.location(in: self)     let touchednode = self.atPoint(touchLocation!)if touch?.tapCount == 1 {        print("single tap")        if let name = touchednode.name        {            if name == "enemySprite"            {                //handle single Tap             }         }    }if touch?.tapCount == 2 {        print("double tap")        if let name = touchednode.name        {            if name == "enemySprite"            {                //handle double Tap             }         }    }}

如何使每个抽头计数互斥?

UPDATE

根据Apurv的回答和Whirlwind的评论我认为下面的代码显示了工作.

overrIDe func dIDMove(to vIEw: SKVIEw) {    var tapGesture = UITapGestureRecognizer(target: self,action: #selector(self.vIEw.sampleTapGestureTapped(recognizerMethod:)))    self.vIEw.addGestureRecognizer(tapGesture!)    tapGesture.numberOfTapsrequired = 1;    var tapGestureDouble = UITapGestureRecognizer(target: self,action: #selector(self.vIEw.sampleTapGestureTapped(recognizerMethod2:)))    self.vIEw.addGestureRecognizer(tapGestureDouble!)    tapGestureDouble.numberOfTapsrequired = 2;    [tapGesture requireGestureRecognizerToFail : tapGestureDouble];}

它不起作用,我得到错误说,

Value of type ’SKVIEw?’ has no member ‘sampleTapGestureTapped(recognizerMethod:)’ and Value of type ’SKVIEw?’ has no member ‘sampleTapGestureTapped(recognizerMethod2:)’

指向轻敲手势变量的声明

另外,我得到错误

Expected Expression in the container literal

指向上面方法中的最后一行.

我想我在这里错过了一些东西,我真的很感激对此的一些帮助和澄清.

解决方法 您不必访问VIEwController …您可以处理场景中的点击,如下所示:

import SpriteKitclass GameScene: SKScene {    var recognizers:[UIGestureRecognizer] = []    overrIDe func dIDMove(to vIEw: SKVIEw) {        // Get label node from scene and store it for use later        let single = UITapGestureRecognizer(target: self,action: #selector(GameScene.singleTapHandler(recognizer:)))        vIEw.addGestureRecognizer(single)        single.numberOfTapsrequired = 1        recognizers.append(single)        let double = UITapGestureRecognizer(target: self,action: #selector(GameScene.doubleTapHandler(recognizer:)))        vIEw.addGestureRecognizer(double)        double.numberOfTapsrequired = 2        recognizers.append(double)        single.require(toFail: double)    }    overrIDe func willMove(from vIEw: SKVIEw) {        super.willMove(from: vIEw)        for recognizer in recognizers {            self.vIEw?.removeGestureRecognizer(recognizer)        }        recognizers.removeAll()    }    func singleTapHandler(recognizer:UITapGestureRecognizer){        print("Single tap detected")    }    func doubleTapHandler(recognizer:UITapGestureRecognizer){        print("Double tap detected")    }}

当然,在VIEwController上调用一些方法可以通过几种方式完成(例如委托)……但是,根据你的评论,我认为处理当前场景中的点击是你想要实现的.

编辑:

要回答评论中的问题…您可以通过在视图中查找触摸位置,将其转​​换为场景中的位置以及抓取该位置处的节点来获取触摸的节点:

func singleTapHandler(recognizer:UITapGestureRecognizer){        print("Single tap detected")        let locationInVIEw = recognizer.location(in: self.vIEw)        let locationInScene = self.convertPoint(fromVIEw: locationInVIEw)        print(locationInScene)       let node = atPoint(locationInScene)        if let nodename = node.name {            //do stuff        }        //or        if let sprite = node as? SKSpriteNode {            // node is an SKSpriteNode        }    }
总结

以上是内存溢出为你收集整理的ios – 如何在touchesBegan方法中发生双击时防止单击被调用全部内容,希望文章能够帮你解决ios – 如何在touchesBegan方法中发生双击时防止单击被调用所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/1059977.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-25
下一篇2022-05-25

发表评论

登录后才能评论

评论列表(0条)

    保存