核心動(dòng)畫(huà),也是iOS常用的東西。但以前的時(shí)候居然很少用到,唉。在此需好好記錄一下。
Core Animation,核心動(dòng)畫(huà),是一組非常強(qiáng)大的動(dòng)畫(huà)處理API。Core Animation是直接作用在CALayer上的,并不是UIView。
Core Animation依然在QuartzCore.framework中,這個(gè)框架已經(jīng)默認(rèn)加入了工程,因此只需導(dǎo)入頭文件就行了。
先來(lái)看看Core Animation里面的繼承結(jié)構(gòu):

其中CAMediaTiming是協(xié)議。在使用過(guò)程中,一般不會(huì)直接使用CAAnimation類(lèi),而是使用它的子類(lèi)CABasicAnimation等。其中CAPropertyAnimation也是不能直接使用的,它是提供一個(gè)NSString類(lèi)型的keyPath屬性,你可以指定CALayer的某個(gè)屬性名為keyPath,并且對(duì)CALayer的這個(gè)屬性的值進(jìn)行修改,達(dá)到相應(yīng)的動(dòng)畫(huà)效果。比如,指定@"position"為keyPath,就會(huì)修改CALayer的position屬性的值,以達(dá)到平移的動(dòng)畫(huà)效果。因此,初始化好CAPropertyAnimation的子類(lèi)對(duì)象后,必須先設(shè)置keyPath,搞清楚要修改的是CALayer的哪個(gè)屬性,執(zhí)行的是怎樣的動(dòng)畫(huà)。
Core Animation使用步驟如下:
- 初始化一個(gè)CAAnimation對(duì)象,并設(shè)置一些動(dòng)畫(huà)相關(guān)屬性;
- 通過(guò)調(diào)用CALayer的addAnimation:forKey:方法增加CAAnimation對(duì)象到CALayer中,這樣就能開(kāi)始執(zhí)行動(dòng)畫(huà);
- 通過(guò)調(diào)用CALayer的removeAnimationForKey:方法可以停止CALayer中的動(dòng)畫(huà).
CAAnimation的常用屬性有以下幾種:
- duration:動(dòng)畫(huà)的持續(xù)時(shí)間;
- repeatCount:動(dòng)畫(huà)的重復(fù)次數(shù);
- timingFunction:控制動(dòng)畫(huà)運(yùn)行的節(jié)奏;
timingFunction可選的值有:
kCAMediaTimingFunctionLinear(線(xiàn)性):勻速,給你一個(gè)相對(duì)靜態(tài)的感覺(jué);
kCAMediaTimingFunctionEaseIn(漸進(jìn)):動(dòng)畫(huà)緩慢進(jìn)入,然后加速離開(kāi);
kCAMediaTimingFunctionEaseOut(漸出):動(dòng)畫(huà)全速進(jìn)入,然后減速的到達(dá)目的地;
kCAMediaTimingFunctionEaseInEaseOut(漸進(jìn)漸出):動(dòng)畫(huà)緩慢的進(jìn)入,中間加速,然后減速的到達(dá)目的地。這個(gè)是默認(rèn)的動(dòng)畫(huà)行為。- delegate:動(dòng)畫(huà)代理,用來(lái)監(jiān)聽(tīng)動(dòng)畫(huà)的執(zhí)行過(guò)程.
其中代理方法有:
@interface NSObject (CAAnimationDelegate)
// 動(dòng)畫(huà)開(kāi)始執(zhí)行的時(shí)候觸發(fā)這個(gè)方法
-(void)animationDidStart:(CAAnimation *)anim;
// 動(dòng)畫(huà)執(zhí)行完畢的時(shí)候觸發(fā)這個(gè)方法
-(void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag;
@end
下面舉幾個(gè)例子:
我們?cè)谟脛?dòng)畫(huà)的時(shí)候,一般用CABasicAnimation類(lèi)。
平移動(dòng)畫(huà):
- (void)viewDidLoad {
[super viewDidLoad];
_subView = [[UIView alloc] init];
_subView.layer.position = CGPointMake(100, 100);
_subView.layer.bounds = CGRectMake(0, 0, 100, 100);
_subView.backgroundColor = [UIColor redColor];
[self.view addSubview:_subView];
//平移動(dòng)畫(huà)
CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"position"];
anim.duration = 1.5;
anim.fromValue = [NSValue valueWithCGPoint:CGPointMake(50, 80)];
//也可以通過(guò)transform屬性來(lái)設(shè)置
//CATransform3D form = CATransform3DMakeTranslation(350, 350, 0);
//anim.toValue = [NSValue valueWithCATransform3D:form];
anim.delegate = self;
//保持動(dòng)畫(huà)執(zhí)行后的狀態(tài)
anim.removedOnCompletion = NO;
anim.fillMode = kCAFillModeForwards;
[_subView.layer addAnimation:anim forKey:@"translate"];
縮放動(dòng)畫(huà):
//縮放動(dòng)畫(huà)
CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"bounds"];
anim.duration = 2;
anim.toValue = [NSValue valueWithCGRect:CGRectMake(0, 0, 30, 30)];
[_subView.layer addAnimation:anim forKey:nil];
旋轉(zhuǎn)動(dòng)畫(huà):
CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"transform"];
anim.duration = 1.5;
// 繞著(0, 0, 1)這個(gè)向量軸順時(shí)針旋轉(zhuǎn)45°
anim.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI_4, 0, 0, 1)];
[_subView.layer addAnimation:anim forKey:nil];
CABasicAnimation改變視圖的方式就是通過(guò)初始化的時(shí)候的keyPath來(lái)找CALayer中對(duì)應(yīng)的屬性,可以從官方文檔中查詢(xún)所有的Animatable Properties。
對(duì)了,CABasicAnimation只能讓CALayer的屬性從某個(gè)值漸變到另一個(gè)值,僅僅是在2個(gè)值之間漸變。