Objective c 如何同时设置不同核心动画层的动画?

Objective c 如何同时设置不同核心动画层的动画?,objective-c,core-animation,Objective C,Core Animation,我目前正在尝试在iOS上使用核心动画实现一个动画。现在,我可以使用CAAnimationGroup将多个动画应用到单个层,但如果我想在不同的层上同时重复这一点,事情就会变得模糊不清 目前看来,CAAnimationGroup是一个单例类,或者至少,我似乎只得到一个实例,我使用[CAAnimationGroup animation]进行分配 有什么想法吗 NSMutableDictionary* elementInstanceData = [self.elementInstanceValues o

我目前正在尝试在iOS上使用核心动画实现一个动画。现在,我可以使用CAAnimationGroup将多个动画应用到单个层,但如果我想在不同的层上同时重复这一点,事情就会变得模糊不清

目前看来,CAAnimationGroup是一个单例类,或者至少,我似乎只得到一个实例,我使用[CAAnimationGroup animation]进行分配

有什么想法吗

NSMutableDictionary* elementInstanceData = [self.elementInstanceValues objectForKey:elementInstance];
                NSArray* animationValues = [elementInstanceData objectForKey:@"animationValues"];
                NSArray* keyTimeValues = [elementInstanceData objectForKey:@"keyTimeValues"];
                NSNumber* elementDurationTime = elementInstanceData[@"duration"];
                if(animationValues != nil)
                {
                    NSMutableArray* transValues = [[NSMutableArray alloc]init];
                    NSMutableArray* scaleValues = [[NSMutableArray alloc]init];
                    NSMutableArray* rotateValues = [[NSMutableArray alloc]init];

                    for(NSDictionary* transforms in animationValues)
                    {
                        NSValue* trans = transforms[@"translate"];
                        [transValues addObject:trans];

                        NSValue* scale = transforms[@"scale"];
                        [scaleValues addObject:scale];

                        NSValue* rotate = transforms[@"rotate"];
                        [rotateValues addObject:rotate];
                    }

                    NSMutableArray* ratioTimeValues = [[NSMutableArray alloc]init];

                    for(NSNumber* time in keyTimeValues)
                    {
                        float percentage = ([time floatValue] / [elementDurationTime floatValue]);
                        [ratioTimeValues addObject:[NSNumber numberWithFloat:percentage ]];
                    }

                    NSCAssert( [ratioTimeValues count] == [transValues count], @"Keytime/value mismatch (times:%d, values: %d)", [ratioTimeValues count], [transValues count]) ;

                    CAKeyframeAnimation* transAnim = [CAKeyframeAnimation animationWithKeyPath:@"position"];
                    [transAnim setValues:transValues];
                    [transAnim setKeyTimes:ratioTimeValues];
                    transAnim.beginTime = CACurrentMediaTime() + startTime;
                    transAnim.duration = durationTime;
                    [allAnimations addObject:transAnim];

                    CAKeyframeAnimation* scaleAnim = [CAKeyframeAnimation animationWithKeyPath:@"transform"];
                    [scaleAnim setValues:scaleValues];
                    [scaleAnim setKeyTimes:ratioTimeValues];
                    scaleAnim.beginTime = CACurrentMediaTime() + startTime;
                    scaleAnim.duration = durationTime;
                    [allAnimations addObject:scaleAnim];

                    CAKeyframeAnimation* rotAnim = [CAKeyframeAnimation animationWithKeyPath:@"transform.rotation.z"];
                    [rotAnim setValues:rotateValues];
                    [rotAnim setKeyTimes:ratioTimeValues];
                    rotAnim.beginTime = CACurrentMediaTime() + startTime;
                    rotAnim.duration = durationTime;
                    [allAnimations addObject:rotAnim];
                }

                CAAnimationGroup* elementInstanceAnimationGroup = [CAAnimationGroup animation];
                elementInstanceAnimationGroup.animations = allAnimations;
                elementInstanceAnimationGroup.beginTime = CACurrentMediaTime();
                elementInstanceAnimationGroup.duration = [elementDurationTime floatValue];
                elementInstanceAnimationGroup.delegate = self;

                [elementInstanceData setObject:elementInstanceAnimationGroup forKey:@"animationGroup"];
                UIView* targetView = [elementInstanceData objectForKey:@"target"];
                [targetView.layer addAnimation:elementInstanceAnimationGroup forKey:nil];

可以创建动画或动画组并将其添加到多个层

    CABasicAnimation* fadeIn = [CABasicAnimation animationWithKeyPath:@"opacity"];
    fadeIn.duration = 0.35;
    fadeIn.fromValue = [NSNumber numberWithDouble:0];
    fadeIn.toValue = [NSNumber numberWithDouble:1];
    for (int i = 0; i < self.indicatorBars.count; i++) {
        [self.indicatorBars[i] addAnimation:fadeIn forKey:@"opacity"];
    }
我可以使用CAAnimationGroup将多个动画应用到单个层,但如果我想在不同层上同时重复这些动画,事情就会变得模糊不清

单个动画组可以为不同命名子层的特性设置动画

例如,假设我有一个包含两个子层的层。第一个子层的名称为manny,第二个子层的名称为moe。假设我想分别设置两个子层位置的动画


然后,我对一个动画使用sublayers.manny.position的关键路径,以及sublayers.moe.position的关键路径,对它们进行分组,并将该组附加到超层。

您可以创建一个动画组并将其添加到多个层,没有问题。您是否有您认为应该可以使用的代码示例?如果动画属性定义了特定于某一层的动画集合,则如何将相同的CAAnimationGroup添加到多个层?我希望每个层有不同的动画/关键点时间值。所以我不知道一个单一的CAAnimationGroup现在会如何将哪些动画应用到哪些层。好的,如果你需要不同层的不同动画,那么就这样做。我不知道你在问什么。但是如果我想让一组不同的动画同时应用到不同的图层上呢?例如:NSArray*animations1=。。。。NSArray*动画2=。。。。CAGroupAnimation*anim1=[CAAnimationGroup animation];anim1.animations=animations1;[第1层添加动画:动画1];[第2层添加动画:动画2];如果我只是想错了,请提前道歉!它似乎没有生气。我猜这是因为我将动画添加到动画块上下文之外的层。尝试使用[UIView animateWithDuration:animations:]执行此操作,但似乎也不行。也许问题是我需要找到一种更好的方法来调试核心动画对象,比如如何检查值是否随时间而变化?另外一个问题,只是不确定诊断这个问题的最佳方法。你能发布实际的代码吗?这可能是你使用的价值观的问题。这肯定不是因为你要做多个动画,核心动画不需要或使用UIView动画块。我也尝试过在我的时间偏移之前不使用CAMediaTime。这两种情况下都不起作用,所以我仍然不确定正确的用法。可能是您的关键路径。双重检查-也可能不为动画设置关键点为零?