Objective c 如何同时设置不同核心动画层的动画?
我目前正在尝试在iOS上使用核心动画实现一个动画。现在,我可以使用CAAnimationGroup将多个动画应用到单个层,但如果我想在不同的层上同时重复这一点,事情就会变得模糊不清 目前看来,CAAnimationGroup是一个单例类,或者至少,我似乎只得到一个实例,我使用[CAAnimationGroup animation]进行分配 有什么想法吗Objective c 如何同时设置不同核心动画层的动画?,objective-c,core-animation,Objective C,Core Animation,我目前正在尝试在iOS上使用核心动画实现一个动画。现在,我可以使用CAAnimationGroup将多个动画应用到单个层,但如果我想在不同的层上同时重复这一点,事情就会变得模糊不清 目前看来,CAAnimationGroup是一个单例类,或者至少,我似乎只得到一个实例,我使用[CAAnimationGroup animation]进行分配 有什么想法吗 NSMutableDictionary* elementInstanceData = [self.elementInstanceValues o
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。这两种情况下都不起作用,所以我仍然不确定正确的用法。可能是您的关键路径。双重检查-也可能不为动画设置关键点为零?