CAAnimationGroup 动画组

实际开发中一个物体的运动往往是复合运动,单一属性的运动情况比较少,但恰恰属性动画每次进行动画设置时一次只能设置一个属性进行动画控制(不管是基础动画还是关键帧动画都是如此),这样一来要做一个复合运动的动画就必须创建多个属性动画进行组合。对于一两种动画的组合或许处理起来还比较容易,但是对于更多动画的组合控制往往会变得很麻烦,动画组的产生就是基于这样一种情况而产生的。动画组是一系列动画的组合,凡是添加到动画组中的动画都受控于动画组,这样一来各类动画公共的行为就可以统一进行控制而不必单独设置,而且放到动画组中的各个动画可以并发执行,共同构建出复杂的动画效果。

动画组使用起来并不复杂,首先单独创建单个动画(可以是基础动画也可以是关键帧动画),然后将基础动画添加到动画组,最后将动画组添加到图层即可。

下面这个实例是,先创建两个动画,最后再把他们添加到 动画组中,首先是 关键帧动画,让这个 layer 走一个矩形, 然后 是基础动画, 让他沿着对角线走,

CALayer *layerGroup = [[CALayer alloc] init];
layerGroup.bounds = CGRectMake(0, 0, 40, 40);
layerGroup.backgroundColor = [UIColor redColor].CGColor;
layerGroup.position = CGPointMake(5, 5);
[self.view.layer addSublayer:layerGroup];

CAKeyframeAnimation *keyAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
UIBezierPath *bezier = [UIBezierPath bezierPathWithRect:CGRectMake(10, 100, 300, 300)];
keyAnimation.path = bezier.CGPath;
keyAnimation.duration = 6.0;
keyAnimation.removedOnCompletion = NO;
keyAnimation.fillMode = kCAFillModeForwards;
keyAnimation.calculationMode = kCAAnimationCubic;

CABasicAnimation *basic = [[CABasicAnimation alloc] init];
basic.keyPath = @"transform";
basic.beginTime = 6;
basic.duration = 2;
basic.removedOnCompletion = NO;
basic.fillMode = kCAFillModeForwards;
basic.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeTranslation(300, 300, 1)];


CAAnimationGroup *group = [[CAAnimationGroup alloc] init];
group.duration = 8;
group.removedOnCompletion = NO;
group.fillMode = kCAFillModeForwards;
group.animations = @[keyAnimation,basic];
[layerGroup addAnimation:group forKey:nil];
CAAnimationGroup 动画组_第1张图片
组动画.gif

这就是利用组动画的效果,不过有一些地方需要注意:

  • 首先,一定要注意设置组动画的时间间隔,
    比如,给组动画添加两个动画,第一个是6s,第二个是2s,但是组动画的时间间隔要设置成 3s,这样整个完整的动画不会走完就停止了,

  • 其次,默认组动画当中的动画是同时进行的, 如果我们需要他们按添加顺序执行怎么办?
    就如我上图这个例子当中,我是先执行了第一个动画,在执行第二个动画,那么是怎么办到的呢?
    这时候就用到了 beginTime 了,如上例中,我让第二个动画的 beginTime 从第一个动画结束后的时间执行,这个就可以做到按顺序执行了,

     basic.beginTime = 6;
    

你可能感兴趣的:(CAAnimationGroup 动画组)