微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

检测何时在 Apple Watch 上点击 SKNode

如何解决检测何时在 Apple Watch 上点击 SKNode

我正在使用 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!"
}

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

解决方法

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

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

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

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

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

无论如何,两者都应该有效。如果您有任何其他问题或需要澄清,请告诉我。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。