核心動畫,也是iOS常用的東西袱院。但以前的時候居然很少用到屎慢,唉。在此需好好記錄一下忽洛。
Core Animation腻惠,核心動畫,是一組非常強大的動畫處理API欲虚。Core Animation是直接作用在CALayer上的集灌,并不是UIView。
Core Animation依然在QuartzCore.framework中苍在,這個框架已經默認加入了工程绝页,因此只需導入頭文件就行了。
先來看看Core Animation里面的繼承結構:
其中CAMediaTiming是協(xié)議寂恬。在使用過程中续誉,一般不會直接使用CAAnimation類,而是使用它的子類CABasicAnimation等初肉。其中CAPropertyAnimation也是不能直接使用的酷鸦,它是提供一個NSString類型的keyPath屬性,你可以指定CALayer的某個屬性名為keyPath牙咏,并且對CALayer的這個屬性的值進行修改臼隔,達到相應的動畫效果。比如妄壶,指定@"position"為keyPath摔握,就會修改CALayer的position屬性的值,以達到平移的動畫效果丁寄。因此氨淌,初始化好CAPropertyAnimation的子類對象后,必須先設置keyPath伊磺,搞清楚要修改的是CALayer的哪個屬性盛正,執(zhí)行的是怎樣的動畫。
Core Animation使用步驟如下:
- 初始化一個CAAnimation對象屑埋,并設置一些動畫相關屬性;
- 通過調用CALayer的addAnimation:forKey:方法增加CAAnimation對象到CALayer中豪筝,這樣就能開始執(zhí)行動畫;
- 通過調用CALayer的removeAnimationForKey:方法可以停止CALayer中的動畫.
CAAnimation的常用屬性有以下幾種:
- duration:動畫的持續(xù)時間;
- repeatCount:動畫的重復次數;
- timingFunction:控制動畫運行的節(jié)奏;
timingFunction可選的值有:
kCAMediaTimingFunctionLinear(線性):勻速,給你一個相對靜態(tài)的感覺;
kCAMediaTimingFunctionEaseIn(漸進):動畫緩慢進入摘能,然后加速離開;
kCAMediaTimingFunctionEaseOut(漸出):動畫全速進入续崖,然后減速的到達目的地;
kCAMediaTimingFunctionEaseInEaseOut(漸進漸出):動畫緩慢的進入,中間加速团搞,然后減速的到達目的地袜刷。這個是默認的動畫行為。- delegate:動畫代理莺丑,用來監(jiān)聽動畫的執(zhí)行過程.
其中代理方法有:
@interface NSObject (CAAnimationDelegate)
// 動畫開始執(zhí)行的時候觸發(fā)這個方法
-(void)animationDidStart:(CAAnimation *)anim;
// 動畫執(zhí)行完畢的時候觸發(fā)這個方法
-(void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag;
@end
下面舉幾個例子:
我們在用動畫的時候著蟹,一般用CABasicAnimation類。
平移動畫:
- (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];
//平移動畫
CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"position"];
anim.duration = 1.5;
anim.fromValue = [NSValue valueWithCGPoint:CGPointMake(50, 80)];
//也可以通過transform屬性來設置
//CATransform3D form = CATransform3DMakeTranslation(350, 350, 0);
//anim.toValue = [NSValue valueWithCATransform3D:form];
anim.delegate = self;
//保持動畫執(zhí)行后的狀態(tài)
anim.removedOnCompletion = NO;
anim.fillMode = kCAFillModeForwards;
[_subView.layer addAnimation:anim forKey:@"translate"];
縮放動畫:
//縮放動畫
CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"bounds"];
anim.duration = 2;
anim.toValue = [NSValue valueWithCGRect:CGRectMake(0, 0, 30, 30)];
[_subView.layer addAnimation:anim forKey:nil];
旋轉動畫:
CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"transform"];
anim.duration = 1.5;
// 繞著(0, 0, 1)這個向量軸順時針旋轉45°
anim.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI_4, 0, 0, 1)];
[_subView.layer addAnimation:anim forKey:nil];
CABasicAnimation改變視圖的方式就是通過初始化的時候的keyPath來找CALayer中對應的屬性梢莽,可以從官方文檔中查詢所有的Animatable Properties萧豆。
對了,CABasicAnimation只能讓CALayer的屬性從某個值漸變到另一個值昏名,僅僅是在2個值之間漸變涮雷。