我遇到了一个问题,即我有一系列重叠的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识别技术?
谢谢,-蝙蝠侠
CAAnimations delegate很强,因此您可能需要对其进行设置nil以避免保留周期!