Swift 使SKLabelNode忽略接触

Swift 使SKLabelNode忽略接触,swift,sprite-kit,touch,Swift,Sprite Kit,Touch,在Swift和SpriteKit中,可以将对象指定为“isUserInteractionEnabled=false”。令人困惑的是,这并不意味着对象将忽略触摸并让这些触摸通过它下面的节点 按照我构建SpriteKit应用程序的方式,我通常会创建一个节点(如SKShapeNode或SKSpriteNode),然后在其上贴上标签。我想要的是标签忽略触摸并让这些触摸通过它后面的节点,但我无法理解如何做到这一点,如果“isUserInteractionEnable”不是票证 有什么建议吗?下面是一个示例

在Swift和SpriteKit中,可以将对象指定为“isUserInteractionEnabled=false”。令人困惑的是,这并不意味着对象将忽略触摸并让这些触摸通过它下面的节点

按照我构建SpriteKit应用程序的方式,我通常会创建一个节点(如SKShapeNode或SKSpriteNode),然后在其上贴上标签。我想要的是标签忽略触摸并让这些触摸通过它后面的节点,但我无法理解如何做到这一点,如果“isUserInteractionEnable”不是票证

有什么建议吗?下面是一个示例标签,它接收触摸,但不应:

class MenuButton: SKShapeNode {

    /*  The MenuBar will have as children nine buttons of two types.  Dialog Springers and SubMenu Droppers  */

    // MARK: - Class Variables

    var title = "Button"
    var menu = SKShapeNode()

    let buttonLabel = SKLabelNode(fontNamed: devFont4)

    init(title: String)
    {
        super.init()

        isUserInteractionEnabled = true

        self.title = title
        self.name = "\(title) Menu Button"
        let btnLen = title.count * 10 + 16

        let menuSize = CGSize(width: btnLen, height: 32)
        menu = SKShapeNode(rectOf: menuSize)
        addChild(menu)

        menu.fillColor = .clear
        menu.strokeColor = .clear
        menu.lineWidth = 0

        menu.zPosition = 501

        // Add Label
        let letterHeight: CGFloat = 22
        buttonLabel.text = title
        buttonLabel.name = "\(title) Label"
        buttonLabel.fontSize = letterHeight
        buttonLabel.fontColor = .black
        buttonLabel.zPosition = 502
        buttonLabel.position = CGPoint(x: 0, y: Int(-letterHeight/2) + 2)
        buttonLabel.isUserInteractionEnabled = false
        addChild(buttonLabel)

    }
}

只有一个第一响应者接收触摸事件。
isUserInteractionEnabled
用于决定先调用哪一个,即使两个都已启用。播放下面的代码,你可以感受到发生了什么

class Button: SKLabelNode{
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    print("button")
}
}

class MenuButton: SKShapeNode {

/*  The MenuBar will have as children nine buttons of two types.  Dialog Springers and SubMenu Droppers  */

// MARK: - Class Variables

var title = "Button"
var menu = SKShapeNode()

let buttonLabel = Button.init()

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    print("hit")
}

init(title: String)
{
    super.init()

    isUserInteractionEnabled = true




    self.title = title
    self.name = "\(title) Menu Button"
    let btnLen = title.count * 10 + 16

    let menuSize = CGSize(width: btnLen, height: 32)
    menu = SKShapeNode(rectOf: menuSize)
    addChild(menu)

    menu.fillColor = .green
    menu.strokeColor = .clear
    menu.lineWidth = 0

    menu.zPosition = 501
    menu.isUserInteractionEnabled = false
    // Add Label
    let letterHeight: CGFloat = 122

    buttonLabel.text = title
    buttonLabel.name = "\(title) Label"
    buttonLabel.fontSize = letterHeight
    buttonLabel.fontColor = .black
    buttonLabel.zPosition = 502
    buttonLabel.position = CGPoint(x: 0, y: Int(-letterHeight/2) + 2)
    buttonLabel.isUserInteractionEnabled = true
    addChild(buttonLabel)

     self.path = UIBezierPath.init(rect:self.calculateAccumulatedFrame()).cgPath
    self.fillColor = UIColor.red

 }

 required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}
} 
class按钮:SKLabelNode{
覆盖func TouchesBegind(Touchs:Set,带有事件:UIEvent?){
打印(“按钮”)
}
}
类菜单按钮:SKShapeNode{
/*菜单栏将有两种类型的九个按钮作为子菜单。对话框跳板和子菜单下拉菜单*/
//MARK:-类变量
var title=“按钮”
var menu=SKShapeNode()
让buttonLabel=Button.init()
覆盖func TouchesBegind(Touchs:Set,带有事件:UIEvent?){
打印(“点击”)
}
初始化(标题:字符串)
{
super.init()
isUserInteractionEnabled=true
self.title=标题
self.name=“\(标题)菜单按钮”
设btnLen=title.count*10+16
let menuSize=CGSize(宽:btnLen,高:32)
menu=SKShapeNode(rectOf:menuSize)
addChild(菜单)
menu.fillColor=.green
menu.strokeColor=.clear
menu.lineWidth=0
menu.zPosition=501
menu.isUserInteractionEnabled=false
//添加标签
let letterHeight:CGFloat=122
buttonLabel.text=标题
buttonLabel.name=“\(标题)标签”
buttonLabel.fontSize=字体高度
buttonLabel.fontColor=.black
按钮标签zPosition=502
按钮标签位置=CGPoint(x:0,y:Int(-letterHeight/2)+2)
buttonLabel.isUserInteractionEnabled=true
addChild(按钮标签)
self.path=UIBezierPath.init(rect:self.calculateacumeratedframe()).cgPath
self.fillColor=UIColor.red
}
必需的初始化?(编码器aDecoder:NSCoder){
fatalError(“初始化(编码者:)尚未实现”)
}
} 

只有一个第一响应者接收触摸事件。
isUserInteractionEnabled
用于决定先调用哪一个,即使两个都已启用。播放下面的代码,你可以感受到发生了什么

class Button: SKLabelNode{
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    print("button")
}
}

class MenuButton: SKShapeNode {

/*  The MenuBar will have as children nine buttons of two types.  Dialog Springers and SubMenu Droppers  */

// MARK: - Class Variables

var title = "Button"
var menu = SKShapeNode()

let buttonLabel = Button.init()

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    print("hit")
}

init(title: String)
{
    super.init()

    isUserInteractionEnabled = true




    self.title = title
    self.name = "\(title) Menu Button"
    let btnLen = title.count * 10 + 16

    let menuSize = CGSize(width: btnLen, height: 32)
    menu = SKShapeNode(rectOf: menuSize)
    addChild(menu)

    menu.fillColor = .green
    menu.strokeColor = .clear
    menu.lineWidth = 0

    menu.zPosition = 501
    menu.isUserInteractionEnabled = false
    // Add Label
    let letterHeight: CGFloat = 122

    buttonLabel.text = title
    buttonLabel.name = "\(title) Label"
    buttonLabel.fontSize = letterHeight
    buttonLabel.fontColor = .black
    buttonLabel.zPosition = 502
    buttonLabel.position = CGPoint(x: 0, y: Int(-letterHeight/2) + 2)
    buttonLabel.isUserInteractionEnabled = true
    addChild(buttonLabel)

     self.path = UIBezierPath.init(rect:self.calculateAccumulatedFrame()).cgPath
    self.fillColor = UIColor.red

 }

 required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}
} 
class按钮:SKLabelNode{
覆盖func TouchesBegind(Touchs:Set,带有事件:UIEvent?){
打印(“按钮”)
}
}
类菜单按钮:SKShapeNode{
/*菜单栏将有两种类型的九个按钮作为子菜单。对话框跳板和子菜单下拉菜单*/
//MARK:-类变量
var title=“按钮”
var menu=SKShapeNode()
让buttonLabel=Button.init()
覆盖func TouchesBegind(Touchs:Set,带有事件:UIEvent?){
打印(“点击”)
}
初始化(标题:字符串)
{
super.init()
isUserInteractionEnabled=true
self.title=标题
self.name=“\(标题)菜单按钮”
设btnLen=title.count*10+16
let menuSize=CGSize(宽:btnLen,高:32)
menu=SKShapeNode(rectOf:menuSize)
addChild(菜单)
menu.fillColor=.green
menu.strokeColor=.clear
menu.lineWidth=0
menu.zPosition=501
menu.isUserInteractionEnabled=false
//添加标签
let letterHeight:CGFloat=122
buttonLabel.text=标题
buttonLabel.name=“\(标题)标签”
buttonLabel.fontSize=字体高度
buttonLabel.fontColor=.black
按钮标签zPosition=502
按钮标签位置=CGPoint(x:0,y:Int(-letterHeight/2)+2)
buttonLabel.isUserInteractionEnabled=true
addChild(按钮标签)
self.path=UIBezierPath.init(rect:self.calculateacumeratedframe()).cgPath
self.fillColor=UIColor.red
}
必需的初始化?(编码器aDecoder:NSCoder){
fatalError(“初始化(编码者:)尚未实现”)
}
} 
在Swift和SpriteKit中,可以将对象指定为 “isUserInteractionEnabled=false”。令人困惑的是,这并不意味着 对象将忽略接触并让这些接触传递到 它下面的节点

这是不正确的,isUserInteractionEnabled=false意味着对象将忽略触摸并让触摸通过它

你有一个完全不同的问题。在代码中,主菜单没有大小,因此它正在穿过标签、内部菜单节点和外部菜单节点,并命中场景

在Swift和SpriteKit中,可以将对象指定为 “isUserInteractionEnabled=false”。令人困惑的是,这并不意味着 对象将忽略接触并让这些接触传递到 它下面的节点

这是不正确的,isUserInteractionEnabled=false意味着对象将忽略触摸并让触摸通过它


你有一个完全不同的问题。在代码中,主菜单没有大小,因此它正在穿过标签、内部菜单节点和外部菜单节点,进入场景。

我需要使用SKShapeNode重新熟悉自己。为了我自己的利益,我有点太老练了。我需要重新熟悉SKShapeNode。为了我自己的利益,我有点太老练了。