iOS:核心动画之动画组CAAnimationGroup
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"]; }
演示结果如下:
开始时:
某一时刻:(由于动画过程中截取的图,截图比较大一些)
结束时:
程序猿神奇的手,每时每刻,这双手都在改变着世界的交互方式!