【发布时间】:2016-01-24 17:07:36
【问题描述】:
我已经制作了一个应用程序,并且一直在使用具有此类特殊属性的自定义子类
class SKSpriteNodeB: SKSpriteNode{
var tempFlag = Bool()
var tempA = CGFloat()
var tempB = CGFloat()
var tempC = CGFloat()
}
并像这样调用:
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
for _ in touches {
let touch: UITouch = touches.first!
let location = touch.locationInNode(self)
let touchedNode = self.nodeAtPoint(location) as? SKSpriteNodeB
touchedNode.tempA = 5.0
touchedNode.tempFlag = false
//Do something
}}
这在 iOS 9.0 及更高版本中运行良好,但是当我在运行 iOS 8.4 的 iPad mini 上测试它时,这些 SKSpriteNodeB 对触摸没有响应。我有其他不是 SKSpriteNodeB 的节点并且运行正常。一些建议将不胜感激!谢谢!
【问题讨论】:
-
您是否将精灵的
userInteractionEnabled属性设置为true?此外,除非您向精灵添加了子节点,否则无需检查nodeAtPoint,因为只有在触摸精灵时才会调用touchesBegan。 -
我没有将它设置为true,但没有将
userInteractionEnabled显式设置为false,因为我认为它默认为false。另外我认为我需要nodeAtPoint,因为我有不同的节点类型,即SKLabelNode,并且我有一个if语句来检查touchedNode.name -
我想我可能已经解决了。我必须对此进行更多研究,但我认为这与节点的 zPosition 有关。我做了一个简单的
print(touchedNode.name)并发现由于某种原因在iOS 8.4 中当我将节点的hidden属性设置为true时,我仍然可以点击它。我必须增加节点的zPosition才能点击它。你知道这是为什么吗? -
设置节点的
hidden属性可以防止它被渲染。该节点仍然与场景中的其他节点交互并响应触摸。我相信您需要设置userInteractionEnable = true以允许您的精灵子类接收触摸事件。 -
设置
userInteractionEnabled = true解决了这个问题并使其现在可以点击。然而,现在我有时可以点击节点并点击位于其下方的另一个SKLabelNode,即使它设置为hidden和userInteractionEnabled = true。我可能会放弃,让我的应用只兼容 9.0 及更高版本。
标签: ios sprite-kit subclass skspritenode