NSAnimationContext结束时如何触发回调?

3 macos cocoa core-animation objective-c

我有一个动画可以移动一些视图.当这个动画完成时,我希望窗口重新计算keyview循环.我的代码与以下模拟代码类似:

[NSAnimationContext beginGrouping];        
[newView setAlpha: 0.0]; //hide newView
[self addSubView:newView];

//position the views
[[oldView animator] setFrame: newFrame1];
[[newView animator] setFrame: newFrame2];

[[newView animator] setAlpha: 1.0]; //fade-in newView

[NSAnimationContext endGrouping]; 

[[self window] recalculateKeyViewLoop];
Run Code Online (Sandbox Code Playgroud)

此代码的问题recalculateKeyViewLoop是在视图处于新位置之前调用,这意味着keyviewloop是错误的.

我该如何解决?

我的第一个是recalculateKeyViewLoop从动画结束时调用回调,但我无法弄清楚如何做到这一点.

Ash*_*ark 5

一些不那么明显的东西,或者至少不是我的东西,就是当你setFrame:用钥匙frameSize和钥匙做时,有两个动画正在进行frameOrigin.

根据您的原始帧和最终帧的不同,您可能需要将自己注册为其中一个或两个的委托.

我还建议您复制一下您从中获取的动画-animationForKey:,并将修改后的副本存储在animations对象的字典中.这样,只有在特定对象的动画持续时间结束时,才会调用您的代理,而不是动画该键的所有对象.

例如.

CAAnimation *animation = [[view animationForKey:@"frameOrigin"] copy];
animation.delegate = self;
[view setAnimations:[NSDictionary dictionaryWithObject:animation forKey:@"frameOrigin"]];
Run Code Online (Sandbox Code Playgroud)

这样,您的动画对象将取代该视图的默认动画对象.然后实现您感兴趣的任何委托方法.