使SKLabelNode忽略触摸

时间:2019-03-25 16:53:11

标签: swift sprite-kit touch

在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)

    }
}

2 个答案:

答案 0 :(得分:1)

只有一个第一响应者可以接收touches事件。 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")
}
} 

答案 1 :(得分:1)

  

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

那是不正确的,isUserInteractionEnabled = false表示对象将忽略触摸,并让触摸通过它。

您有一个完全不同的问题。在您的代码中,主菜单没有大小,因此它穿过标签,内部菜单节点和外部菜单节点,从而达到您的目的。