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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM