为什么 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 个子项:

当以下运行时,如果用户触摸包含图像或文本的按钮的一部分(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() }
}