HTML5   发布时间:2022-04-27  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了ios – 如何在touchesBegan方法中发生双击时防止单击被调用大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我已经实现了单击和双击.但每当我双击屏幕时,也会运行单击代码.请参阅以下代码

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 SpriteKit

class 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方法中发生双击时防止单击被调用所遇到的程序开发问题。

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

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。