目标是同时为多个 SCNNode 设置动画,然后在所有动画完成后调用完成 block 。并行动画具有相同的持续时间,因此如果一起开始,将同时完成。
This SO answer建议使用 group
Sprite Kit 的功能,但 Scene Kit 中没有类似功能,因为 SCNScene
类缺少 runAction
.
一种选择是针对每个节点单独运行所有操作,并让每个操作调用相同的完成函数,该完成函数必须维护一个标志以确保它只被调用一次。
另一种选择是避免完成处理程序并在与动画持续时间匹配的延迟后调用完成代码。然而,这会在测试期间产生竞争条件,因为有时动画在完成之前就被暂停了。
不过,这似乎很笨拙。在 SceneKit 中对多个节点的动画进行分组然后调用完成处理程序的正确方法是什么?
最佳答案
我最初处理这个问题的方法是,因为所有初始动画都具有相同的持续时间,所以将完成处理程序仅应用于其中一个 Action 。但是,有时,动画会挂断( SCNAction completion handler awaits gesture to execute )。
我当前成功的解决方案是不将完成处理程序与 SCNAction
结合使用。但有延迟:
func delay(delay:Double, closure:()->()) {
dispatch_after(
dispatch_time(
DISPATCH_TIME_NOW,
Int64(delay * Double(NSEC_PER_SEC))
),
dispatch_get_main_queue(), closure)
}
调用示例:
delay(0.95) {
self.scaleNode_2.runAction(moveGlucoseBack)
self.fixedNode_2.runAction(moveGlucoseBack)
self.scaleNode_3.hidden = true
self.fixedNode_3.hidden = true
}
我怀疑这可以称为“正确的方式”,但它适用于我的使用,并消除了我在尝试使用完成处理程序在多个节点上运行动画时遇到的随机挂起。
关于ios - SceneKit:如何一起为多个 SCNNode 设置动画,然后调用完成 block 一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39091024/