为什么 Xcode TouchesEnded() topMost touched 节点总是 return 子节点而不是父节点?
Why does Xcode TouchesEnded() topMost touched node always return child nodes rather than the parent node?
我将 SKSpriteNode 子类化为 MenuButton()
MenuButton() 包含 2 个子项:
SKSpriteNode
(一张图片)
SKSpriteNode
(部分文字)
当以下运行时,如果用户触摸包含图像或文本的按钮的一部分(MenuButton() 的子级),它不会执行,因为 image/text 具有不同的名称到按钮,他们是第一个 touchedNode
.
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
guard let touch = touches.first else { return }
let location = touch.location(in: self)
let touchedNode = atPoint(location)
let touchedNodeName = atPoint(location).name
if let nodeName = touchedNodeName, nodeName == ("btnPlay") { self.showGameModeMenu() }
}
之前,我使用:
let touchedNodes = nodes(at: location)
for node in nodes {
if let nodeName = node.name, nodeName == "btnPlay" { self.showGameModeMenu() }
}
但是,当另一个节点 (btnCloseLeaderboard
) 出现在顶部 btnPlay
时,它会遍历并执行两者,而不仅仅是最顶部的节点 (btnCloseLeaderboard
)
我试图为子节点设置 isUserInteractionEnabled = false
,但这不起作用。它仍然将 then 视为最顶层的节点。
如何防止这种情况发生?
如果 child 的 parent 的名称是 "btnPlay" 或者如果名为 "btnPlay" 的节点是自己点击(对于图像或文本之外的点击 children)。如果是这样,您可以将您的顶级代码更改为:
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
guard let touch = touches.first else { return }
let location = touch.location(in: self)
let touchedNode = atPoint(location)
if touchedNode.parent?.name == "btnPlay" || touchedNode.name == "btnPlay" { showGameModeMenu() }
}
我将 SKSpriteNode 子类化为 MenuButton()
MenuButton() 包含 2 个子项:
SKSpriteNode
(一张图片)SKSpriteNode
(部分文字)
当以下运行时,如果用户触摸包含图像或文本的按钮的一部分(MenuButton() 的子级),它不会执行,因为 image/text 具有不同的名称到按钮,他们是第一个 touchedNode
.
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
guard let touch = touches.first else { return }
let location = touch.location(in: self)
let touchedNode = atPoint(location)
let touchedNodeName = atPoint(location).name
if let nodeName = touchedNodeName, nodeName == ("btnPlay") { self.showGameModeMenu() }
}
之前,我使用:
let touchedNodes = nodes(at: location)
for node in nodes {
if let nodeName = node.name, nodeName == "btnPlay" { self.showGameModeMenu() }
}
但是,当另一个节点 (btnCloseLeaderboard
) 出现在顶部 btnPlay
时,它会遍历并执行两者,而不仅仅是最顶部的节点 (btnCloseLeaderboard
)
我试图为子节点设置 isUserInteractionEnabled = false
,但这不起作用。它仍然将 then 视为最顶层的节点。
如何防止这种情况发生?
如果 child 的 parent 的名称是 "btnPlay" 或者如果名为 "btnPlay" 的节点是自己点击(对于图像或文本之外的点击 children)。如果是这样,您可以将您的顶级代码更改为:
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
guard let touch = touches.first else { return }
let location = touch.location(in: self)
let touchedNode = atPoint(location)
if touchedNode.parent?.name == "btnPlay" || touchedNode.name == "btnPlay" { showGameModeMenu() }
}