在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)
}
}
答案 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表示对象将忽略触摸,并让触摸通过它。
您有一个完全不同的问题。在您的代码中,主菜单没有大小,因此它穿过标签,内部菜单节点和外部菜单节点,从而达到您的目的。