Objective c NSView在动画之后删除

Objective c NSView在动画之后删除,objective-c,xcode,macos,nsview,Objective C,Xcode,Macos,Nsview,我不知道为什么它被证明是如此困难,但基本上我想在我的屏幕上动画NSView,一旦它完成动画,删除该NSView。然而,我似乎完全找不到关于如何做到这一点的参考资料。有人能帮忙吗 我是这样开始我的动画的 NSRect frame = blob.frame; frame.origin.x = animationStopX; [NSAnimationContext beginGrouping]; [[NSAnimationContext currentContext] setDuration:time

我不知道为什么它被证明是如此困难,但基本上我想在我的屏幕上动画NSView,一旦它完成动画,删除该NSView。然而,我似乎完全找不到关于如何做到这一点的参考资料。有人能帮忙吗

我是这样开始我的动画的

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

一旦它完成了,我没有办法从中得到回调

在您的
开始分组
语句之后,添加以下内容:

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

setCompletionHandler:
NSAnimationContext
类中的一个方法。

在您的
开始分组
语句之后,添加以下内容:

[[NSAnimationContext currentContext] setCompletionHandler:^{
        [self.blob removeFromSuperview];
    }];
setCompletionHandler:
NSAnimationContext
类中的一个方法。

在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];
   });
在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];
   });

啊,老兄,我真希望我几天前就看到了。最后,我创建了一个单独的运行循环,它只是解析并检查了一些属性。如果满足某些条件,我最终会移除该对象。下次尝试执行类似操作时,我会记住这一点。setCompletionHandler适用于OS X 1.7及更高版本。请记住,即使动画被“取消”,也会调用“setCompletionHandler”,也就是说,如果您有一个事件触发另一个方法调用,而该方法的动画为“blob”,并且在其“setCompletionHandler”中,您可以[self.view addSubview self.blob],你可能会在SpinLock中挂起你的应用程序,或者即使你刚刚添加了它,你也可能会产生不希望的结果,例如删除视图。这是因为应用程序可能会暂停主线程,优先处理另一个调度呼叫,并使两个“取消块”发生故障。啊,伙计,我希望我几天前就看到了。我最终生成了一个单独的运行循环,该循环只是解析并检查了一些属性。如果满足某些条件,我最终会删除该对象。下次尝试执行类似操作时,我会记住这一点。setCompletionHandler适用于OS X 1.7及更高版本。请记住,即使动画n已被“取消”,即,如果您有一个事件触发另一个对方法的调用,该方法将激活“blob”,并在其“setCompletionHandler”中激活[self.view addSubview self.blob],你可能会在SpinLock中挂起你的应用程序,或者你可能会有不希望的结果,例如,即使你刚刚添加了视图,也会删除它。这是因为应用程序可能会暂停主线程,优先处理另一个调度调用,并按顺序调用两个“取消块”。