我遇到了一个问题,我有一系列重叠的 CATransfer/CAAnimation 序列,当动画停止时,所有这些序列都需要执行自定义操作,但是我只需要一个 AnimationDidStop 的委托处理程序。
然而,我遇到了一个问题,似乎没有一种方法可以唯一地标识 animationDidStop 委托中的每个 CATransfer/CAAnimation。
我通过 CAAnimation 中公开的键/值系统解决了这个问题。
当你开始你的动画时,使用 CATransfer/CAAnimation 上的 setValue 方法来设置你的标识符和值,当 animationDidStop 触发时使用:
-(void)volumeControlFadeToOrange
{
CATransition* volumeControlAnimation = [CATransition animation];
[volumeControlAnimation setType:kCATransitionFade];
[volumeControlAnimation setSubtype:kCATransitionFromTop];
[volumeControlAnimation setDelegate:self];
[volumeControlLevel setBackgroundImage:[UIImage imageNamed:@"SpecialVolume1.png"] forState:UIControlStateNormal];
volumeControlLevel.enabled = true;
[volumeControlAnimation setDuration:0.7];
[volumeControlAnimation setValue:@"Special1" forKey:@"MyAnimationType"];
[[volumeControlLevel layer] addAnimation:volumeControlAnimation forKey:nil];
}
- (void)throbUp
{
doThrobUp = true;
CATransition *animation = [CATransition animation];
[animation setType:kCATransitionFade];
[animation setSubtype:kCATransitionFromTop];
[animation setDelegate:self];
[hearingAidHalo setBackgroundImage:[UIImage imageNamed:@"m13_grayglow.png"] forState:UIControlStateNormal];
[animation setDuration:2.0];
[animation setValue:@"Throb" forKey:@"MyAnimationType"];
[[hearingAidHalo layer] addAnimation:animation forKey:nil];
}
在你的 AnimationDidStop 代表:
- (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag{
NSString* value = [theAnimation valueForKey:@"MyAnimationType"];
if ([value isEqualToString:@"Throb"])
{
//... Your code here ...
return;
}
if ([value isEqualToString:@"Special1"])
{
//... Your code here ...
return;
}
//Add any future keyed animation operations when the animations are stopped.
}
这样做的另一个方面是,它允许您将状态保存在键值配对系统中,而不必将其存储在委托类中。代码越少越好。
一定要看看 苹果关键值对编码的借鉴。
在 AnimationDidStop 委托中,是否有更好的 CAAnimation/CA 过渡识别技术?
谢谢, 巴特加