2016-03-11 94 views
1

我有一个由按钮触发的SCNNodes动画。在随后按下按钮时,动画反转。前进动画总是可以正常工作,但反向动画有时会挂起。也就是说,它将播放完成处理程序之前的部分然后冻结。但是,当我应用我的三种手势(平移,平移,缩放)中的任何一种时,它都会挂起并完成处理程序部分。相关代码:SCNAction完成处理程序等待手势执行

  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()调用。

回答

1

在一个动作中调用SCNNode.removeFromParentNode()对我来说似乎很腥。我看到另外一个案例,这似乎是造成不稳定的行为,虽然没有文件证明你不应该这样做。

我认为SCNAction.removeFromParentNode()的存在是一个很大的提示,并且调用该操作将优于直接操作节点树。

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

+0

据我所知,'runAction()'只作用于单个节点。我的处理程序在4个不同的对象上执行操作,因此分组将无法工作。类似的情况使用'SCNAction.sequence()'。一旦第一对同时动作完成,我需要同时运行处理程序中的所有对象,不同的对象。我错过了什么吗? (顺便说一句,原子和债券保持分开是有原因的。)谢谢,哈尔。 – bpedit