iphone - 如何在animationDidStop委托(delegate)中识别CAAnimation?

标签 iphone core-animation

我遇到了一个问题,我有一系列重叠的 CATransition/CAAnimation 序列,所有这些序列我都需要在动画停止时执行自定义操作,但我只想要一个动画DidStop 的委托(delegate)处理程序。

但是,我遇到了一个问题,似乎没有一种方法可以唯一标识animationDidStop 委托(delegate)中的每个 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委托(delegate)中:

- (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.
 }

另一方面,它允许您在键值配对系统中保留状态,而不必将其存储在委托(delegate)类中。代码越少越好。

请务必查看 Apple Reference on Key Value Pair Coding .

animationDidStop 委托(delegate)中是否有更好的 CAAnimation/CATransition 识别技术?

谢谢, --巴特加尔

最佳答案

巴特加尔的技术太复杂了。为什么不利用 addAnimation 中的 forKey 参数呢?它就是为了这个目的而设计的。只需取出对 setValue 的调用并将键字符串移至 addAnimation 调用即可。例如:

[[hearingAidHalo layer] addAnimation:animation forKey:@"Throb"];

然后,在animationDidStop回调中,您可以执行以下操作:

if (theAnimation == [[hearingAidHalo layer] animationForKey:@"Throb"]) ...

关于iphone - 如何在animationDidStop委托(delegate)中识别CAAnimation?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1255086/

相关文章:

php - 示例 : Objective C method alongside a php method

iOS:从后台(信标)开始监控时,GPS 位置更新仅工作 10 秒

iphone - 什么时候在 Mac/iPhone 上使用 CALayer?

ios - 如何让 CALayers 在进行 3D 变换时使用屏幕中心作为消失点?

ios - 在 iOS 上使用 resizableImages 时避免混合层

iphone - Core Data 应用崩溃并出现 "controllerWillChangeContent : unrecognized selector sent to instance"

iphone - S3PutObjectRequest 在取消之前的 putObjectRequest 后上传失败

objective-c - NSUserDefaults 与 sqlite3

ios - 查找 CALayer 的边界框以绘制到图形上下文中

objective-c - CATextLayer 子像素抗锯齿