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"]; }
演示結果如下:
開始時:
某一時刻:(由於動畫過程中截取的圖,截圖比較大一些)
結束時:
