Отключить тач на весь экран, SpriteKit, как?

Пытаюсь временно отключить тач на весь экран, несмотря на то, что на экране много спрайтов с тачами.

Я подумал, очевидно ошибочно, что отключение сенсорного экрана для сцены сделает это:

    scene?.isUserInteractionEnabled = false

Но это не сработало, поэтому я попробовал это, что также не сработало:

    view?.scene?.isUserInteractionEnabled = false

Это тоже не сработало, поэтому я попробовал это, также изнутри сцены:

    self.isUserInteractionEnabled = false

person Confused    schedule 16.11.2016    source источник
comment
У меня такая же проблема. В отличие от UIKit, в SpriteKit отключение взаимодействия с пользователем для родительского узла не отключает его дочерние узлы. То же самое, когда вы отключаете просмотр сцены.   -  person kelin    schedule 14.04.2021


Ответы (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)

Что это делает, так это добавляет почти прозрачный узел поверх всех элементов размером со сцену. Таким образом, когда пользователь касается экрана, этот узел будет поглощать его вместо чего-либо еще.

person Knight0fDragon    schedule 16.11.2016
comment
Ой. И Юк. Плюс СПАСИБО! Я решил поместить объекты, которые я хочу выключить, в массив, переключить их на взаимодействие, а затем снова включить, когда они мне снова понадобятся. Сбивает с толку, что нет более аккуратного способа временно отключить весь ввод. - person Confused; 16.11.2016
comment
И хороший трюк, слой на 99999, чтобы схватить и проглотить прикосновения! - person Confused; 16.11.2016
comment
Сейчас я использую эту функцию перечисления, чтобы удалить один конкретный узел... панель таймера из другого вопроса... можете ли вы объяснить, что делает (node, stop)? - person Confused; 17.11.2016
comment
узел — это текущий узел в вашем списке, который оценивается, вы используете stop, чтобы остановить перечисляющий поиск, когда вы нашли узел, который искали. developer.apple.com/reference/spritekit/sknode/ - person Knight0fDragon; 17.11.2016
comment
ЭТО СЕНСАЦИЯ. Я понятия не имел, что можно остановить перечисление теста/проверки/поиска при поиске. Это идеально. БЛАГОДАРЮ ВАС!!! Работает как шарм!!! scene?.enumerateChildNodes(withName: "timerBar", using: { (node, stop) in node.removeFromParent()}) - person Confused; 17.11.2016
comment
@Knight0fDragon, не могли бы вы взглянуть на этот вопрос для меня stackoverflow.com/questions/43072572/. Спасибо - person ItsMeAgain; 06.04.2017
comment
Для идентификации сенсорных узлов вы можете ввести, например, формальный протокол Touchable и наследовать от него определенные узлы. Затем во время перечисления проверьте, есть ли узел is Touchable. Вы также можете добавить флаг для этой цели. Обычно у нас есть некоторые узлы, к которым никогда нельзя прикасаться. - person kelin; 14.04.2021

Следующее отключит все касания

self.view?.isUserInteractionEnabled = false
person 0x141E    schedule 17.11.2016
comment
Нет, не работает, ноды все равно будут получать касания. - person kelin; 14.04.2021