NSView删除动画后

问题描述:

我不知道为什么它被证明是如此困难,但基本上我想在我的屏幕上为NSView制作动画,并且一旦完成该动画,就移除该NSView。但似乎我完全没有提到如何做到这一点。有人可以帮忙吗?NSView删除动画后

我开始我的动画这样

NSRect frame = blob.frame; 
frame.origin.x = animationStopX; 
[NSAnimationContext beginGrouping]; 
[[NSAnimationContext currentContext] setDuration:timeToDisappear]; 
[[blob animator] setFrame:frame]; 
[NSAnimationContext endGrouping]; 

我没有从这个得到一个回调,一旦它完成或任何方式。

beginGrouping声明后立刻补充一点:

[[NSAnimationContext currentContext] setCompletionHandler:^{ 
     [self.blob removeFromSuperview]; 
    }]; 

setCompletionHandler:NSAnimationContext类的方法。

+0

噢人,我希望我能有这个前几天看到。我最终创建了一个单独的运行循环,只是解析并检查了一些属性。如果满足某些条件,我最终删除了该物体。 下次我尝试做这样的事情时,我会记住它。 – MZimmerman6 2012-05-01 15:13:24

+0

setCompletionHandler适用于OS X 1.7及更高版本。 – RocketMan 2012-07-25 17:14:27

+1

请记住,即使动画被“取消”,也会调用“setCompletionHandler”,即如果您有另一个事件触发另一个调用动画blob的方法,并且在其setCompletionHandler中,您将自动调用setApletionHandler [self.view addSubview self .blob],您可能最终会将您的应用挂在SpinLock上,或者您可能会收到不良结果,例如删除视图,即使您刚添加它。这是因为应用程序可以暂停mainThread,优先考虑另一个调度呼叫,并且按顺序调用两个“取消块”。 – strange 2013-09-12 19:53:38

万一10.6或以下(因此NSAnimationContext的completionHandler)不是这种方法只使用块和10.6+将工作的一个选项:

double delayInSeconds = 1.0; 
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); 
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
     [mySubView removeFromSuperview]; 
    });