SCNAction 完成处理程序等待手势执行

Posted

技术标签:

【中文标题】SCNAction 完成处理程序等待手势执行【英文标题】:SCNAction completion handler awaits gesture to execute 【发布时间】:2016-03-11 16:30:42 【问题描述】:

我有一个由按钮触发的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()) 调用取消隐藏五个节点,按名称访问它们。有时完成会挂起,有时不会。但是,如果它在保留在同一页面上的特定会话中挂起,它将继续在后续按钮切换时挂起。我还没有弄清楚任何因果关系。我已将 removeFromParentNode() 调用更改为 hidden = true,这目前正在运行,但让我很紧张。

这里到底会发生什么?

编辑 1:虽然它一直在工作,但我已经看到过几次挂断(在很多次中)使用提到的后一个代码,所以这并不是严格地由于 removeFromParentNode() 调用。

【问题讨论】:

我遇到了类似的问题,我在这里报告过:***.com/questions/56189836/… 【参考方案1】:

在一个动作中调用SCNNode.removeFromParentNode() 对我来说似乎很可疑。我见过另一种情况,这似乎导致了不稳定的行为,尽管没有文档表明您不应该这样做。

我认为SCNAction.removeFromParentNode() 的存在是一个很大的提示,调用该操作比直接操作节点树更好。

使用SCNAction.group()SCNAction.sequence() 会使您的代码更简单一些。

【讨论】:

据我所知runAction() 仅作用于单个节点。我这里的处理程序作用于 4 个不同的对象,因此分组不起作用。使用SCNAction.sequence() 的类似情况。完成第一对同时操作后,我需要同时运行处理程序中的所有操作,不同的对象。我错过了什么吗? (顺便说一句,原子和键保持分开是有原因的。)谢谢,哈尔。

以上是关于SCNAction 完成处理程序等待手势执行的主要内容,如果未能解决你的问题,请参考以下文章

您如何等待任务计划程序任务在批处理文件或 C# 中完成?

等待两个异步完成函数完成,然后再执行下一行代码

从 Java 执行命令并等待命令完成

等待函数完成处理程序完成失败

等待完成处理程序完成 - Swift

AlamoFire downloadProgress 完成处理程序到异步/等待