Swift 使SKLabelNode忽略接触
在Swift和SpriteKit中,可以将对象指定为“isUserInteractionEnabled=false”。令人困惑的是,这并不意味着对象将忽略触摸并让这些触摸通过它下面的节点 按照我构建SpriteKit应用程序的方式,我通常会创建一个节点(如SKShapeNode或SKSpriteNode),然后在其上贴上标签。我想要的是标签忽略触摸并让这些触摸通过它后面的节点,但我无法理解如何做到这一点,如果“isUserInteractionEnable”不是票证 有什么建议吗?下面是一个示例标签,它接收触摸,但不应:Swift 使SKLabelNode忽略接触,swift,sprite-kit,touch,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)
}
}
只有一个第一响应者接收触摸事件。
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。为了我自己的利益,我有点太老练了。