2016-11-16 29 views
0

我試圖暫時禁用整個屏幕上的觸摸,儘管它們在屏幕上有很多與touchesBegun的精靈。關閉整個屏幕的觸摸,SpriteKit,怎麼樣?

我認爲,很明顯錯誤,關閉觸摸的場景會做到這一點:

scene?.isUserInteractionEnabled = false 

但沒有工作,所以我想這一點,也沒有工作:

view?.scene?.isUserInteractionEnabled = false 

這也沒有工作,所以我想這一點,也從裏面的場景:

self.isUserInteractionEnabled = false 

回答

2

有把沒有全球性的方法觸摸,無論在繪圖隊列的頂部是第一響應者。

你需要從場景中通過所有節點的迭代和關閉它們:

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

現在的問題是把他們重新打開,如果你使用這種方法,你會打開它的一切,所以你可能要採取命名約定的所有可觸摸精靈

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

這將查找具有與可觸摸開頭的名稱的任何節點。

此方法涉及遞歸,所以如果您有大量節點,它可能會很慢。相反,你應該使用一種替代方法:

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) 

這是做什麼是巴掌在一個幾乎透明的節點上的所有元素場景的大小。通過這種方式,當用戶觸摸屏幕時,該節點將吸收它而不是其他任何東西。

+0

哎喲。和俞。再感謝你!我決定把我想要關閉的物體放入一個數組中,將它們轉換爲interactionoff,然後在我再次需要它們時再打開。因爲沒有一種更好的方式來臨時關閉所有輸入。 – Confused

+0

不錯的訣竅,99999的「圖層」可以抓取併吞下! – Confused

+0

我現在使用這個枚舉的東西來刪除一個特定的節點......從另一個問題的定時器欄...你能解釋'(節點,停止)'在做什麼? – Confused

1

下面將禁用所有觸摸

self.view?.isUserInteractionEnabled = false