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"]; }
演示结果如下:
开始时:
                 
某一时刻:(由于动画过程中截取的图,截图比较大一些)  
   
           
结束时:
posted @ 2015-10-16 22:31  XYQ全哥  阅读(2722)  评论(0编辑  收藏  举报