检测何时在 Apple Watch 上点击了 SKNode

Posted

技术标签:

【中文标题】检测何时在 Apple Watch 上点击了 SKNode【英文标题】:Detecting when a SKNode is tapped on Apple Watch 【发布时间】:2021-07-25 21:56:20 【问题描述】:

我正在使用 SpriteKit 为 Apple Watch 编写应用程序,因此我无法访问 touchesBegan 之类的功能,我必须使用 WKTapGestureRecognizer 来检测点击,没什么大不了的,但我在检测节点上的点击时遇到问题. 在我的 InterfaceController 中,我有:

@IBAction func handleTap(tapGestureRecognizer: WKTapGestureRecognizer)
    scene?.didTap(tapGesture: tapGestureRecognizer)

在我的场景文件中,我有

func didTap(tapGesture:WKTapGestureRecognizer) 
    let position = tapGesture.locationInObject()
    let hitNodes = self.nodes(at: position)
    if hitNodes.contains(labelNode) 
    labelNode.text = "tapped!"

问题是点击手势识别器为我提供了触摸点的绝对坐标(例如 11.0、5,0),而我的节点相对于屏幕中心定位(因此它的位置甚至是 -0.99、-11.29虽然在屏幕的中心)因此点击不是在实际点击它时点击节点,而是当我点击屏幕的左上角时。我到处搜索,看起来这是这样做的方法,但我没有发现有人遇到同样的问题。该节点已通过编辑器添加。我做错了什么?

【问题讨论】:

【参考方案1】:

所以你有正确的想法。你弄错了,因为 hitNodes 是一个 SKNodes 数组。那些是新创建的。所以当你使用 hitNodes.contains 时 labelNode 的地址和正在比较的新创建的 SKNode 的地址会完全不同。因此它永远不会被窃听。

这就是我要做的。这将在我的场景文件中。您的 InterfaceController 类是正确的。

func didTap(tapGesture:WKTapGestureRecognizer) 
    let position = tapGesture.locationInObject()
    if labelNode.contains(position) 
        labelNode.text = "tapped!"
    

或者另一种方式是这样。我喜欢这种方式,因为你只有一个函数在 WKInterfaceController 中,而且你的场景文件中不需要任何函数。

@IBAction func tapOnScreenAct(_ sender: WKGestureRecognizer) 
    if scene.labelNode.contains(sender.locationInObject()) 
        scene.labelNode.text = "tapped!"
        

无论哪种方式,两者都应该工作。如果您有任何其他问题或说明,请告诉我。

【讨论】:

以上是关于检测何时在 Apple Watch 上点击了 SKNode的主要内容,如果未能解决你的问题,请参考以下文章

知道何时在 Apple Watch 模态界面控制器中单击取消按钮

Apple Watch 崩溃检测

Apple Watch 是不是被 RFID 读取器检测到?

如何使用 Swift 在 Apple Watch 上添加下拉刷新功能

Apple Watch 通知 - 点击通知

如何将用户从 Apple Watch 通知转移到 Apple Watch App?