Обработчик завершения SCNAction ожидает выполнения жеста

У меня есть анимация SCNNodes запускается кнопкой. При последующем нажатии кнопки анимация переворачивается. Прямая анимация всегда работает нормально, но обратная анимация иногда зависает. То есть он будет воспроизводить часть до того, как обработчик завершения остановится. Но когда я применяю любой из трех моих жестов (панорамирование, перевод, масштабирование), он отменяет зависание и завершает часть обработчика. Соответствующий код:

            else if buttonToggle_1 == true {  buttonToggle_1 = false
                let moveWaterBack = SCNAction.moveTo(homePosition_2, duration: 1)
                let moveValineBack = SCNAction.moveTo(awayPosition_1, duration: 1)

                atomsNode_3.hidden = false
                bondsNode_3.hidden = false

                hideTransients(true)

                atomsNode_3.runAction(moveWaterBack)
                bondsNode_3.runAction(moveWaterBack,
                    completionHandler: {
                        self.atomsNode_2.runAction(moveValineBack) ;
                        self.bondsNode_2.runAction(moveValineBack) ;
                        self.atomsNode_3.removeFromParentNode() ;
                        self.bondsNode_3.removeFromParentNode() ;
                        hideTransients(false)
                    })
            }

hideTransients()) call показывает пять узлов, обращаясь к ним по имени. Иногда завершение зависает, иногда нет. Однако, если он зависает в определенном сеансе, оставаясь на той же странице, он будет зависать при последующем переключении кнопки. Я не выяснил никаких причинно-следственных связей. Я изменил removeFromParentNode() звонки в hidden = true и это в настоящее время работает, но заставляет меня нервничать, чтобы положиться.

Что на Земле может происходить здесь?

правка 1: Хотя он работал довольно стабильно, я видел зависания пару раз (из многих), используя последний упомянутый код, так что это не строго из-за removeFromParentNode() звонки.

1 ответ

Вызов SCNNode.removeFromParentNode() в действии мне кажется подозрительным. Я видел еще один случай, когда это, казалось, вызывало хаотичное поведение, хотя нет документации, по которой вам не следует этого делать.

Я думаю, что существование SCNAction.removeFromParentNode() это довольно большая подсказка, и вызов этого действия предпочтительнее, чем прямое манипулирование деревом узлов.

С помощью SCNAction.group() а также SCNAction.sequence() сделает ваш код немного проще.

Другие вопросы по тегам