当presentScene:transition:完成后,如何通知传入的场景?

jem*_*ons 9 core-animation sprite-kit

假设我正在从一个旧SKScene的过渡SKView到一个新的:

//In some controller somewhere...
-(void)swapScenes{
  MySceneSubclass *newScene = [[MySceneSubclass alloc] initWithSize:CGSizeMake(1024, 768)];
  SKTransition *transition = [SKTransition crossFadeWithDuration:REALLY_LONG_DURATION];
  [[self mySKView] presentScene:newScene transition:transition];
}
Run Code Online (Sandbox Code Playgroud)

让我们另外说我希望我的新场景在转换完成后执行一些动作或动画,但不是之前.我会用什么来触发它?

起初我以为我能够覆盖didMoveToView:这样做,但事实证明这是在过渡的开始时调用的(事后看来,这是有道理的.在交叉淡入淡出中,传入的场景在最开始时被合成动画,即使它的不透明度非常低).

接下来,作为一个冰雹玛丽,我尝试在以下情况后立即拨打新场景presentScene:

-(void)swapScenes{
  MySceneSubclass *newScene = [[MySceneSubclass alloc] initWithSize:CGSizeMake(1024, 768)];
  SKTransition *transition = [SKTransition crossFadeWithDuration:REALLY_LONG_DURATION];
  [[self mySKView] presentScene:newScene transition:transition];
  [newScene doSomethingAfterTransition]; //<----
}
Run Code Online (Sandbox Code Playgroud)

presentScene:可以预见的是立即返回,导致在转换完成之前很久就会调用此方法.

作为最后的手段,我正在考虑这样的事情:

[newScene performSelector:@selector(doSomethingAfterTransition) afterDelay:REALLY_LONG_DURATION];
Run Code Online (Sandbox Code Playgroud)

但是如果可能的话,我真的想避免这种情况.似乎应该有一个委托行动或通知或某些知道过渡何时结束的事情,对吧?

jem*_*ons 11

答案就是盯着我.如上所述,在转换中,两个场景都需要在整个动画中出现.因此didMoveToView:,在转换开始时立即调用传入场景,而不是像我预期的那样在结束时调用.

当然,通过相同的逻辑,直到转换结束才会调用传出场景.这就是我首先要寻找的东西.willMoveFromView:

因此,您可以覆盖-willMoveFromView:传出场景(或者,更有可能是某些共享超类),以在转换完成时发送通知或调用委托或任何您喜欢的内容.在我的情况下,我让它调用一个块,所以我可以保留我的-swapScenes方法本地的一切,但YMMV.