iOS 開發-CAAnimation動畫總結(CAAnimationGroup:動畫組、 CABasicAnimation:基本動畫、 CAKeyframeAnimation:幀動畫、 CATransition:轉場動畫)

使用最經典的一張圖來介紹一下動畫抽象類CAAnimation.同NSOperation一樣,都是抽象類,并不具備封裝操作的能力,必須使用其子類。

CAAnimation.png

CAAnimationGroup:動畫組,多個動畫同時執行。
CABasicAnimation:基本動畫,可以做到平移、縮放、旋轉
CAKeyframeAnimation:幀動畫,動畫可以分成幾個過程執行
CATransition:轉場動畫,可以實現兩個界面或控件的推出、翻頁等效果。

CABasicAnimation:基本動畫

// 正方形按鈕控件
@property (weak, nonatomic) IBOutlet UIButton *basicBtn;

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    
//    CABasicAnimation是CAPropertyAnimation的子類, CAPropertyAnimation有一個字符串類型的keyPath屬性
//    keyPath內容是CALayer的可動畫Animatable屬性,我們可以指定CALayer的某個屬性名為keyPath,并且對CALayer的這個屬性的值進行修改,達到相應的動畫效果。
//    例如:指定keyPath = @"position",就會修改CALayer的position屬性的值,- > 可以實現平移的動畫效果
//    如果fillMode=kCAFillModeForwards同時removedOnComletion=NO,那么在動畫執行完畢后,圖層會保持顯示動畫執行后的狀態。但在實質上,圖層的屬性值還是動畫執行前的初始值,并沒有真正被改變。
//    http://www.lxweimin.com/p/3c0ed03a5816
    
//    [self basicAnimationWithbounds];
    
    [self basicAnimationWithRotation];
    
//  平移可使用  keyPath = @"position";
}

- (void)basicAnimationWithbounds
{
    CABasicAnimation *basic = [CABasicAnimation animationWithKeyPath:@"bounds"];
    basic.duration = 2.0;
    //    basic.fromValue = [NSValue valueWithCGRect:CGRectMake(0, 0, 100, 100)];
    basic.toValue = [NSValue valueWithCGRect:CGRectMake(0, 0, ScreenW, ScreenW)];
    //    basic.fillMode = kCAFillModeForwards;
    //    basic.removedOnCompletion = NO;
    basic.repeatCount = MAXFLOAT;
    
    [self.basicBtn.layer addAnimation:basic forKey:nil];
}


- (void)basicAnimationWithRotation
{
//    [self.basicBtn.layer removeAllAnimations];
    
    CABasicAnimation *basic = [CABasicAnimation animationWithKeyPath:@"transform"];
    basic.duration = 4.0;

    basic.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI * 0.5, 0, 0, 1)];
    basic.fillMode = kCAFillModeForwards;
    basic.removedOnCompletion = NO;
//    basic.repeatCount = MAXFLOAT;
    
    [self.basicBtn.layer addAnimation:basic forKey:nil];
}

CAAnimationGroup:動畫組

@property (weak, nonatomic) IBOutlet UIButton *groupBtn;

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    
    [self caanimationGroup];
}

- (void)caanimationGroup
{
    CAAnimationGroup *groupAnimation = [CAAnimationGroup animation];
                                        
    CABasicAnimation *basic1 = [CABasicAnimation animationWithKeyPath:@"bounds"];
//    basic1.duration = 2.0;
    //    basic.fromValue = [NSValue valueWithCGRect:CGRectMake(0, 0, 100, 100)];
    basic1.toValue = [NSValue valueWithCGRect:CGRectMake(0, 0, ScreenW, ScreenW)];
    //    basic.fillMode = kCAFillModeForwards;
    //    basic.removedOnCompletion = NO;
    basic1.repeatCount = MAXFLOAT;
    
    CABasicAnimation *basic2 = [CABasicAnimation animationWithKeyPath:@"transform"];
//    basic2.duration = 3.0;
    
    basic2.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI * 0.5, 0, 0, 1)];
//    basic2.fillMode = kCAFillModeForwards;
//    basic2.removedOnCompletion = NO;
    //    basic.repeatCount = MAXFLOAT;
    
    
    CABasicAnimation *basic3 = [CABasicAnimation animation];
    basic3.keyPath = @"position";
    CGPoint center = self.groupBtn.center;
    center.y += 300;
    basic3.toValue = [NSValue valueWithCGPoint:center];
    
    groupAnimation.animations = @[basic1,basic2];
    groupAnimation.duration = 0.5;
//    groupAnimation.removedOnCompletion = NO;
//    groupAnimation.fillMode = kCAFillModeForwards;
    groupAnimation.repeatCount = MAXFLOAT;
    
    [self.groupBtn.layer addAnimation:groupAnimation forKey:nil];
    
}

CATransition:轉場動畫

// 在觸摸事件或其他事件的方法中實現,在展示圖片是,為imageview控件添加轉場動畫,開發中在歡迎界面推向主界面時,我們一般使用的是轉場動畫
self.centerImage.image = [UIImage imageNamed:[NSString stringWithFormat:@"meinv%d.jpg",self.imageIndex]];
    
    CATransition *trans = [CATransition animation];
    trans.type = @"pageCurl";
    trans.subtype = kCATransitionFromRight;
    trans.duration = 1.0;
    [self.centerImage.layer addAnimation:trans forKey:nil];

CAKeyframeAnimation:幀動畫

@property (weak, nonatomic) IBOutlet UIButton *keyFrameBtn;

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    [self keyframeAnimation];
}

- (void)keyframeAnimation
{
    CAKeyframeAnimation *keyframeAnimation = [CAKeyframeAnimation animation];
    keyframeAnimation.keyPath = @"transform";
    keyframeAnimation.duration = 1.0;
    NSValue *value1 = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI * 0.5, 0, 0, 1)];
    NSValue *value2 = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI * 1, 0, 0, 1)];
    NSValue *value3 = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI * 1.5, 0, 0, 1)];
    NSValue *value4 = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI * 2, 0, 0, 1)];
    
    keyframeAnimation.values = @[value1,value2,value3,value4];
    keyframeAnimation.fillMode = kCAFillModeForwards;
    
    //    如果fillMode=kCAFillModeForwards同時removedOnComletion=NO,那么在動畫執行完畢后,圖層會保持顯示動畫執行后的狀態。但在實質上,圖層的屬性值還是動畫執行前的初始值,并沒有真正被改變。
    keyframeAnimation.removedOnCompletion = NO;
    keyframeAnimation.repeatCount = MAXFLOAT;
    
    [self.keyFrameBtn.layer addAnimation:keyframeAnimation forKey:nil];
    
}

demo分享鏈接
參考文章

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 在iOS實際開發中常用的動畫無非是以下四種:UIView動畫,核心動畫,幀動畫,自定義轉場動畫。 1.UIView...
    請叫我周小帥閱讀 3,159評論 1 23
  • 目錄: UIView動畫 Core Animation 自定義轉場動畫 UIDynamicAnimator彈簧動畫...
    Ryan___閱讀 646評論 0 5
  • 在iOS中隨處都可以看到絢麗的動畫效果,實現這些動畫的過程并不復雜,今天將帶大家一窺ios動畫全貌。在這里你可以看...
    每天刷兩次牙閱讀 8,572評論 6 30
  • 先看看CAAnimation動畫的繼承結構 CAAnimation{ CAPropertyAnimation { ...
    時間不會倒著走閱讀 1,694評論 0 1
  • 顯式動畫 顯式動畫,它能夠對一些屬性做指定的自定義動畫,或者創建非線性動畫,比如沿著任意一條曲線移動。 屬性動畫 ...
    清風沐沐閱讀 1,975評論 1 5