确定手势识别器中触摸的节点

Posted

技术标签:

【中文标题】确定手势识别器中触摸的节点【英文标题】:Determine Node Touched in Gesture Recognizer 【发布时间】:2018-05-15 20:03:25 【问题描述】:

我有一个 SpriteKit 场景,其中可以有数千个不同的节点。我还在场景中实现了一个单击手势识别器,希望一旦触发手势识别器,我就可以确定场景中哪个节点被触摸。目前,我的(非工作)代码如下所示:

@objc func singleTap(_ sender: UIPinchGestureRecognizer) 
    print("single tap gesture recognized")

    if sender.numberOfTouches == 1 

        let touchPoint = sender.location(in: self.view)
        let touchedNode = self.atPoint(touchPoint)

        if let name = touchedNode.name
        
            if name == "newMapButton"
            
                print("newMapButton Touched")
             else 
                print("what did you touch?")
            
        

    

手势识别器正在工作。当我触摸新的地图按钮时,我会在控制台中获得“识别单击手势”,但仅此而已。我在这里做错了什么?

【问题讨论】:

你的touchedNode.name 不存在 另外,您的接触点位于View 坐标中,而不是Scene 坐标中 如果您的场景类是您的手势代表,则添加 let sceneTouchPoint = convertPoint(fromView:touchPoint) 如果您的视图控制器是您的代表,则添加 if let skView = view as! SKViewlet sceneTouchPoint = skView.convert(touchPoint,to:skView.scene) ...(Rest of code) 【参考方案1】:

    在 GameScene 文件中,我像这样在 didMove 方法中创建了按钮

    let btnTest = SKSpriteNode(imageNamed: "button")
    btnTest.setScale(0.2)
    btnTest.name = "Button"
    btnTest.zPosition = 10
    btnTest.position = CGPoint(x: 100, y: 200)
    self.addChild(btnTest)
    

    在 didMove 中添加手势:

    let tapRec = UITapGestureRecognizer()
    tapRec.addTarget(self, action:#selector(GameScene.tappedView(_:) ))
    tapRec.numberOfTouchesRequired = 1
    tapRec.numberOfTapsRequired = 1
    self.view!.addGestureRecognizer(tapRec)
    

    终于实现了 tappedView 方法

    @objc func tappedView(_ sender:UITapGestureRecognizer) 
    
    if sender.state == .ended 
    
        var post = sender.location(in: sender.view)
        post = self.convertPoint(fromView: post)
        let touchNode = self.atPoint(post)
    
        if let name = touchNode.name
        
            if name == "Button"
            
                print("newMapButton Touched")
             else 
                print("what did you touch?")
            
        
    
    
    

【讨论】:

您的代码应该会失败,视图坐标和场景坐标不同。 我使用坐标进行测试,主要目标是检测触摸。你没摸到吗? poster 说能摸到,拿不到节点 你运行我的代码了吗?我有节点,如果我没有,我为什么要费心发布答案? 我不需要运行您的代码,我知道它不能按预期工作。也许您很幸运,因为您在代码中放置了一个与整个场景大小相同的按钮,或者您在场景中间放置了一个按钮,并将场景大小设置为与视图大小相同,并且将锚点设置为 (0, 0),但您的代码在其他情况下会失败。视图的默认坐标系 (0,0) 位于左上角,场景默认坐标系 (0,0) 位于中心。如果我在 (0,0) 处放置一个按钮并触摸中间 sender.location(in:self.view) 返回 view.width/2,view.height/2,缺少按钮

以上是关于确定手势识别器中触摸的节点的主要内容,如果未能解决你的问题,请参考以下文章

iOS开发系列--触摸事件手势识别摇晃事件耳机线控

iOS开发系列--触摸事件手势识别摇晃事件耳机线控

在没有触摸手势识别器的情况下关闭键盘

iOS开发系列--触摸事件手势识别摇晃事件耳机线控

如何在iOS中将触摸传递给手势识别器?

札记:android手势识别,MotionEvent