CAAnimationGroup——动画组
动画组,是CAAnimation的子类,可以保存一组动画对象,将CAAnimationGroup对象加入层后,组中所有动画对象可以同时并发运行
属性说明:
–animations:用来保存一组动画对象的NSArray
默认情况下,一组动画对象是同时运行的,也可以通过设置动画对象的beginTime属性来更改动画的开始时间
具体的实例如下:
实现功能:在创建的动画组中存入两个基本动画,一个是沿着Z轴旋转360度的动画,另一个是放大2倍的动画,这两个动画并发执行,动画结束后,均不在恢复原状。
代码如下:
//声明属性
#import "ViewController.h"
@interface ViewController ()
@property (strong,nonatomic)CALayer *subLayer; //声明核心动画子层
@end
//创建动画子层,同时创建触摸手势,添加的手势事件处理的是动画组
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//创建子层
self.subLayer = [CALayer layer];
self.subLayer.bounds = CGRectMake(100, 100, 100, 100);
self.subLayer.position = CGPointMake(100, 100);
self.subLayer.backgroundColor = [[UIColor redColor]CGColor];
[self.view.layer addSublayer:self.subLayer];
//添加触摸手势
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tap:)];
tap.numberOfTapsRequired = 1;
tap.numberOfTouchesRequired = 1;
[self.view addGestureRecognizer:tap];
}
//定义方法,返回一个用于旋转的基本动画
#pragma mark 返回一个实现旋转的基本动画
-(CABasicAnimation*)rotationAnimationFromValue:(CGFloat)fromValue toValue:(CGFloat)tovalue
{
//创建基本动画(用于旋转)
CABasicAnimation *baseAnimation = [[CABasicAnimation alloc]init];
//设置形变属性值为旋转属性值
baseAnimation.keyPath = @"transform.rotation.z";
//设置旋转初值
baseAnimation.fromValue = @(fromValue);
//设置旋转终值
baseAnimation.toValue = @(tovalue);
//设置旋转动画持续时间
baseAnimation.duration = 1.0f;
//设置动画旋转结束后不恢复原状
baseAnimation.removedOnCompletion = NO;
baseAnimation.fillMode = kCAFillModeForwards;
return baseAnimation;
}
//定义方法,返回一个用于放缩的基本动画
#pragma mark 返回一个实现放缩的基本动画
-(CABasicAnimation*)scaleAnimationFromValue:(CGFloat)fromValue toValue:(CGFloat)tovalue
{
//创建基本动画(用于放缩)
CABasicAnimation *animScale = [[CABasicAnimation alloc]init];
//设置形变属性为放缩属性值
animScale.keyPath = @"transform.scale";
//设置放缩初值
animScale.fromValue = @(fromValue);
//设置放缩终值
animScale.toValue = @(tovalue);
//设置放缩动画持续时间
animScale.duration = 1.0f;
//设置动画放缩结束后不恢复原状
animScale.removedOnCompletion = NO;
animScale.fillMode = kCAFillModeForwards;
return animScale;
}
//处理触摸手势的事件,创建动画组,并将上面返回的两个动画对象添加进去,然后并发的执行动画组
#pragma mark -tap触摸事件
-(void)tap:(UITapGestureRecognizer *)sender
{
//方式一:依次调用各个的动画,效果也是可以的
//旋转360度
//[self.subLayer addAnimation:[self rotationAnimationFromValue:-M_PI toValue:M_PI] forKey:@"baseAnimation"];
//放大2倍
//[self.subLayer addAnimation:[self scaleAnimationFromValue:1.0 toValue:2.0] forKey:@"animScale"];
//方式二:并发执行动画组中的所有动画
//创建动画组
CAAnimationGroup *Group = [[CAAnimationGroup alloc]init];
//将各种动画对象加入数组中
NSArray *animations = @[[self rotationAnimationFromValue:-M_PI toValue:M_PI],[self scaleAnimationFromValue:1.0 toValue:2.0]];
//动画数组中的动画的属性受动画组的统一控制
Group.animations = animations;
//设置动画组中所有动画的持续时间
Group.duration = 1.0;
//设置动画组中所有动画运行结束后不恢复原状
Group.removedOnCompletion = NO;
Group.fillMode = kCAFillModeForwards;
//往子层中添加动画组
[self.subLayer addAnimation:Group forKey:@"Group"];
}
演示结果如下:
开始时:
某一时刻:(由于动画过程中截取的图,截图比较大一些)
结束时: