我有一个动画可以移动一些视图.当这个动画完成时,我希望窗口重新计算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];
此代码的问题recalculateKeyViewLoop
是在视图处于新位置之前调用,这意味着keyviewloop是错误的.
我该如何解决?
我的第一个是recalculateKeyViewLoop
从动画结束时调用回调,但我无法弄清楚如何做到这一点.
一些不那么明显的东西,或者至少不是我的东西,就是当你setFrame:
用钥匙frameSize
和钥匙做时,有两个动画正在进行frameOrigin
.
根据您的原始帧和最终帧的不同,您可能需要将自己注册为其中一个或两个的委托.
我还建议您复制一下您从中获取的动画-animationForKey:
,并将修改后的副本存储在animations
对象的字典中.这样,只有在特定对象的动画持续时间结束时,才会调用您的代理,而不是动画该键的所有对象.
例如.
CAAnimation *animation = [[view animationForKey:@"frameOrigin"] copy]; animation.delegate = self; [view setAnimations:[NSDictionary dictionaryWithObject:animation forKey:@"frameOrigin"]];
这样,您的动画对象将取代该视图的默认动画对象.然后实现您感兴趣的任何委托方法.