iOS 開(kāi)發(fā)-CAAnimation動(dòng)畫(huà)總結(jié)(CAAnimationGroup:動(dòng)畫(huà)組、 CABasicAnimation:基本動(dòng)畫(huà)、 CAKeyframeAnimation:幀動(dòng)畫(huà)、 CATransition:轉(zhuǎn)場(chǎng)動(dòng)畫(huà))

使用最經(jīng)典的一張圖來(lái)介紹一下動(dòng)畫(huà)抽象類(lèi)CAAnimation.同NSOperation一樣,都是抽象類(lèi),并不具備封裝操作的能力,必須使用其子類(lèi)。

CAAnimation.png

CAAnimationGroup:動(dòng)畫(huà)組,多個(gè)動(dòng)畫(huà)同時(shí)執(zhí)行。
CABasicAnimation:基本動(dòng)畫(huà),可以做到平移、縮放、旋轉(zhuǎn)
CAKeyframeAnimation:幀動(dòng)畫(huà),動(dòng)畫(huà)可以分成幾個(gè)過(guò)程執(zhí)行
CATransition:轉(zhuǎn)場(chǎng)動(dòng)畫(huà),可以實(shí)現(xiàn)兩個(gè)界面或控件的推出、翻頁(yè)等效果。

CABasicAnimation:基本動(dòng)畫(huà)

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

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    
//    CABasicAnimation是CAPropertyAnimation的子類(lèi), CAPropertyAnimation有一個(gè)字符串類(lèi)型的keyPath屬性
//    keyPath內(nèi)容是CALayer的可動(dòng)畫(huà)Animatable屬性,我們可以指定CALayer的某個(gè)屬性名為keyPath,并且對(duì)CALayer的這個(gè)屬性的值進(jìn)行修改,達(dá)到相應(yīng)的動(dòng)畫(huà)效果。
//    例如:指定keyPath = @"position",就會(huì)修改CALayer的position屬性的值,- > 可以實(shí)現(xiàn)平移的動(dòng)畫(huà)效果
//    如果fillMode=kCAFillModeForwards同時(shí)removedOnComletion=NO,那么在動(dòng)畫(huà)執(zhí)行完畢后,圖層會(huì)保持顯示動(dòng)畫(huà)執(zhí)行后的狀態(tài)。但在實(shí)質(zhì)上,圖層的屬性值還是動(dòng)畫(huà)執(zhí)行前的初始值,并沒(méi)有真正被改變。
//    http://www.itdecent.cn/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:動(dòng)畫(huà)組

@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:轉(zhuǎn)場(chǎng)動(dòng)畫(huà)

// 在觸摸事件或其他事件的方法中實(shí)現(xiàn),在展示圖片是,為imageview控件添加轉(zhuǎn)場(chǎng)動(dòng)畫(huà),開(kāi)發(fā)中在歡迎界面推向主界面時(shí),我們一般使用的是轉(zhuǎn)場(chǎng)動(dòng)畫(huà)
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:幀動(dòng)畫(huà)

@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同時(shí)removedOnComletion=NO,那么在動(dòng)畫(huà)執(zhí)行完畢后,圖層會(huì)保持顯示動(dòng)畫(huà)執(zhí)行后的狀態(tài)。但在實(shí)質(zhì)上,圖層的屬性值還是動(dòng)畫(huà)執(zhí)行前的初始值,并沒(méi)有真正被改變。
    keyframeAnimation.removedOnCompletion = NO;
    keyframeAnimation.repeatCount = MAXFLOAT;
    
    [self.keyFrameBtn.layer addAnimation:keyframeAnimation forKey:nil];
    
}

demo分享鏈接
參考文章

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容