我遇到了一个问题,即我有一系列重叠的CATransition / CAAnimation序列,当动画停止时,所有这些序列都需要执行自定义操作,但是我只需要一个animationDidStop委托处理程序。
但是,我有一个问题,似乎没有一种方法可以唯一地标识animationDidStop委托中的每个CATransition / CAAnimation。
我通过作为CAAnimation的一部分公开的键/值系统解决了这个问题。
启动动画时,请使用CATransition / 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 / CATransition识别技术?
谢谢,-蝙蝠侠
CAAnimation
s delegate
很强,因此您可能需要对其进行设置nil
以避免保留周期!