核心動(dòng)畫,也是iOS常用的東西。但以前的時(shí)候居然很少用到,唉。在此需好好記錄一下。
Core Animation,核心動(dòng)畫,是一組非常強(qiáng)大的動(dòng)畫處理API。Core Animation是直接作用在CALayer上的,并不是UIView。
Core Animation依然在QuartzCore.framework中,這個(gè)框架已經(jīng)默認(rèn)加入了工程,因此只需導(dǎo)入頭文件就行了。
先來看看Core Animation里面的繼承結(jié)構(gòu):
其中CAMediaTiming是協(xié)議。在使用過程中,一般不會(huì)直接使用CAAnimation類,而是使用它的子類CABasicAnimation等。其中CAPropertyAnimation也是不能直接使用的,它是提供一個(gè)NSString類型的keyPath屬性,你可以指定CALayer的某個(gè)屬性名為keyPath,并且對CALayer的這個(gè)屬性的值進(jìn)行修改,達(dá)到相應(yīng)的動(dòng)畫效果。比如,指定@"position"為keyPath,就會(huì)修改CALayer的position屬性的值,以達(dá)到平移的動(dòng)畫效果。因此,初始化好CAPropertyAnimation的子類對象后,必須先設(shè)置keyPath,搞清楚要修改的是CALayer的哪個(gè)屬性,執(zhí)行的是怎樣的動(dòng)畫。
Core Animation使用步驟如下:
- 初始化一個(gè)CAAnimation對象,并設(shè)置一些動(dòng)畫相關(guān)屬性;
- 通過調(diào)用CALayer的addAnimation:forKey:方法增加CAAnimation對象到CALayer中,這樣就能開始執(zhí)行動(dòng)畫;
- 通過調(diào)用CALayer的removeAnimationForKey:方法可以停止CALayer中的動(dòng)畫.
CAAnimation的常用屬性有以下幾種:
- duration:動(dòng)畫的持續(xù)時(shí)間;
- repeatCount:動(dòng)畫的重復(fù)次數(shù);
- timingFunction:控制動(dòng)畫運(yùn)行的節(jié)奏;
timingFunction可選的值有:
kCAMediaTimingFunctionLinear(線性):勻速,給你一個(gè)相對靜態(tài)的感覺;
kCAMediaTimingFunctionEaseIn(漸進(jìn)):動(dòng)畫緩慢進(jìn)入,然后加速離開;
kCAMediaTimingFunctionEaseOut(漸出):動(dòng)畫全速進(jìn)入,然后減速的到達(dá)目的地;
kCAMediaTimingFunctionEaseInEaseOut(漸進(jìn)漸出):動(dòng)畫緩慢的進(jìn)入,中間加速,然后減速的到達(dá)目的地。這個(gè)是默認(rèn)的動(dòng)畫行為。- delegate:動(dòng)畫代理,用來監(jiān)聽動(dòng)畫的執(zhí)行過程.
其中代理方法有:
@interface NSObject (CAAnimationDelegate)
// 動(dòng)畫開始執(zhí)行的時(shí)候觸發(fā)這個(gè)方法
-(void)animationDidStart:(CAAnimation *)anim;
// 動(dòng)畫執(zhí)行完畢的時(shí)候觸發(fā)這個(gè)方法
-(void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag;
@end
下面舉幾個(gè)例子:
我們在用動(dòng)畫的時(shí)候,一般用CABasicAnimation類。
平移動(dòng)畫:
- (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)畫
CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"position"];
anim.duration = 1.5;
anim.fromValue = [NSValue valueWithCGPoint:CGPointMake(50, 80)];
//也可以通過transform屬性來設(shè)置
//CATransform3D form = CATransform3DMakeTranslation(350, 350, 0);
//anim.toValue = [NSValue valueWithCATransform3D:form];
anim.delegate = self;
//保持動(dòng)畫執(zhí)行后的狀態(tài)
anim.removedOnCompletion = NO;
anim.fillMode = kCAFillModeForwards;
[_subView.layer addAnimation:anim forKey:@"translate"];
縮放動(dòng)畫:
//縮放動(dòng)畫
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)畫:
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改變視圖的方式就是通過初始化的時(shí)候的keyPath來找CALayer中對應(yīng)的屬性,可以從官方文檔中查詢所有的Animatable Properties。
對了,CABasicAnimation只能讓CALayer的屬性從某個(gè)值漸變到另一個(gè)值,僅僅是在2個(gè)值之間漸變。