【问题标题】:Turn off touch for whole screen, SpriteKit, how?关闭全屏触摸,SpriteKit,如何?
【发布时间】:2017-03-31 02:31:30
【问题描述】:

我正在尝试暂时禁用整个屏幕上的触摸,尽管屏幕上有许多带有 touchesBegun 的精灵。

我认为,显然是错误的,关闭场景的触摸会做到这一点:

    scene?.isUserInteractionEnabled = false

但这不起作用,所以我尝试了这个,但也没有用:

    view?.scene?.isUserInteractionEnabled = false

这也不起作用,所以我也从场景内部尝试了这个:

    self.isUserInteractionEnabled = false

【问题讨论】:

  • 我也有同样的问题。与 UIKit 不同,在 SpriteKit 中禁用父节点的用户交互不会禁用它的子节点。禁用场景视图时也是如此。

标签: swift sprite-kit touch skscene disabled-input


【解决方案1】:

以下将禁用所有触摸

self.view?.isUserInteractionEnabled = false

【讨论】:

  • 不,不工作,节点仍然会收到触摸。
【解决方案2】:

没有关闭触摸的全局方法,绘图队列顶部的任何东西都是第一响应者。

您需要遍历场景中的所有节点并将其关闭:

enumerateChildNodesWithName("//*", usingBlock: 
    { (node, stop) -> Void in  
       node.isUserInteractionEnabled = false
    })

现在问题是重新打开它们,如果你使用这个方法,你会为所有东西打开它,所以你可能想为所有可触摸的精灵采用命名约定

enumerateChildNodesWithName("//touchable", usingBlock: 
    { (node, stop) -> Void in  
       node.isUserInteractionEnabled = true
    })

这将查找名称以 touchable 开头的任何节点。

此方法涉及递归,因此如果您有大量节点,它可能会很慢。相反,您应该使用另一种方法:

let disableTouchNode = SKSpriteNode(color:SKColor(red:0.0,green:0.0,blue:0.0,alpha:0.1),size:self.size)
disableTouchNode.isUserinteractionEnabled = true
disableTouchNode.zPosition = 99999
self.addChild(disableTouchNode)

这样做是在场景大小的所有元素顶部的几乎透明的节点上拍打。这样,当用户触摸屏幕时,该节点将吸收它而不是其他任何东西。

【讨论】:

  • 哎哟。还有玉。再加上谢谢!我决定将我想要关闭的对象放入一个数组中,将它们翻转为interactionoff,然后在我再次需要它们时重新打开。令人困惑的是没有一种更简洁的方法可以暂时关闭所有输入。
  • 还有一个不错的技巧,99999 的“层”可以抓取并吞下触摸!
  • 我现在正在使用这个枚举的东西来删除一个特定的节点......另一个问题的计时器栏......你能解释一下(node, stop)在做什么吗?
  • node 是列表中正在评估的当前节点,当您找到要查找的节点时,您可以使用 stop 停止枚举搜索。 developer.apple.com/reference/spritekit/sknode/…
  • 这太耸人听闻了。我不知道可以在查找时停止枚举测试/检查/搜索。这是理想的。谢谢!!!奇迹般有效!!! scene?.enumerateChildNodes(withName: "timerBar", using: { (node, stop) in node.removeFromParent()})
猜你喜欢
  • 1970-01-01
  • 2014-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多