最近總結(jié)一下CoreAnimation的基本知識(shí)。。绽昼。( CALayer Animatable Properties)
Core Animation,中文翻譯為核心動(dòng)畫须蜗,它是一組非常強(qiáng)大的動(dòng)畫處理API硅确,使用它能做出非常炫麗的動(dòng)畫效果目溉,而且往往是事半功倍。也就是說菱农,使用少量的代碼就可以實(shí)現(xiàn)非常強(qiáng)大的功能缭付。
Core Animation可以用在Mac OS X和iOS平臺(tái)。
Core Animation的動(dòng)畫執(zhí)行過程都是在后臺(tái)操作的循未,不會(huì)阻塞主線程陷猫。
要注意的是,Core Animation是直接作用在CALayer上的的妖,并非UIView绣檬。
先上一張圖,看一下核心動(dòng)畫中的基本類和他們之間的關(guān)系嫂粟,箭頭表示繼承關(guān)系娇未。
下面分一下幾點(diǎn)介紹
- 1.CAAnimation
- 2.CAPropertyAnimation
- 3.CABasicAnimation 基本動(dòng)畫
- 4.CAKeyframeAnimation 關(guān)鍵幀動(dòng)畫
- 5.CATransition 轉(zhuǎn)場(chǎng)動(dòng)畫
- 6.CAAnimationGroup 動(dòng)畫組
1、CAAnimation
CAAnimation 是核心動(dòng)畫中的基礎(chǔ)抽象類星虹,其他的都是繼承自他來使用忘蟹。
CAAnimation
provides the basic support for the [CAMediaTiming] and [CAAction]protocols.
You do not create instance of
[CAAnimation]: to animate Core Animation layers or SceneKit objects,
create instances of the concrete subclasses [CABasicAnimation],
[CAKeyframeAnimation], [CAAnimationGroup], or [CATransition]
CAAnimation遵循< CAMediaTiming >和< CAAction >協(xié)議,不能直接使用CAAnimation去實(shí)現(xiàn)動(dòng)畫效果搁凸,而是使用它的子類CABasicAnimation 、CAKeyframeAnimation狠毯、CAAnimationGroup护糖、CATransition。
CAMediaTiming
可以調(diào)整動(dòng)畫的持續(xù)時(shí)間嚼松、重復(fù)次數(shù)嫡良、動(dòng)畫的速度等。
CAAction
通過響應(yīng)動(dòng)作的方法來實(shí)現(xiàn)動(dòng)畫
看一下CAAnimation里面的API
+ (nullable id)defaultValueForKey:(NSString *)key;
類方法:根據(jù)相對(duì)的屬性key返回屬性值献酗,有點(diǎn)類似字典
- (BOOL)shouldArchiveValueForKey:(NSString *)key;
根據(jù)相對(duì)的屬性key該屬性的值返回是否可以歸檔寝受。
屬性(部分屬性是遵循CAMediaTiming協(xié)議中的)
屬性 | 說明 |
---|---|
duration | 動(dòng)畫持續(xù)的時(shí)間,默認(rèn)是0 |
speed | 速度比例罕偎,默認(rèn)是1很澄,如果調(diào)節(jié)為n,那么在動(dòng)畫持續(xù)時(shí)間內(nèi)會(huì)加速執(zhí)行n次 |
beginTime | 開始時(shí)間 颜及,默認(rèn)是0甩苛, 若想延遲ns,就設(shè)置為CACurrentMediaTime()+n俏站,CACurrentMediaTime()為圖層的當(dāng)前時(shí)間 |
timeOffset | 時(shí)間偏移讯蒲,用來暫停動(dòng)畫使用 |
repeatCount | 動(dòng)畫重復(fù)的次數(shù),默認(rèn)為0肄扎,無限循環(huán)可以設(shè)置HUGE_VALF或者M(jìn)AXFLOAT |
repeatDuration | 動(dòng)畫重復(fù)的時(shí)間間隔墨林,默認(rèn)0 |
autoreverses | 倒向動(dòng)畫赁酝,默認(rèn)是NO,如果是Yes,動(dòng)畫正向執(zhí)行后旭等,會(huì)倒向執(zhí)行一次 |
removedOnCompletion | 默認(rèn)為YES酌呆,代表動(dòng)畫執(zhí)行完畢后就從圖層上移除,圖形會(huì)恢復(fù)到動(dòng)畫執(zhí)行前的狀態(tài)辆雾。如果想讓圖層保持顯示動(dòng)畫執(zhí)行后的狀態(tài)肪笋,那就設(shè)置為NO,不過還要設(shè)置fillMode為kCAFillModeForwards |
fillMode | 決定動(dòng)畫開始之前或者結(jié)束之后的形態(tài) |
timingFunction | 速度控制函數(shù)度迂,控制動(dòng)畫運(yùn)行的節(jié)奏藤乙,可以使用該類中的類方法: + (instancetype)functionWithName:(NSString *)name; name傳入上面的類型創(chuàng)建一個(gè)CAMediaTimingFunction對(duì)象 |
fillMode屬性
kCAFillModeForwards 當(dāng)動(dòng)畫結(jié)束后,layer會(huì)一直保持著動(dòng)畫最后的狀態(tài)惭墓,即動(dòng)畫停止的狀態(tài),不過要配合removedOnCompletion屬性設(shè)置為NO使用才有效果坛梁,不然沒效果。
kCAFillModeBackwards 在動(dòng)畫開始前腊凶,只需要將動(dòng)畫加入了一個(gè)layer划咐,layer便立即進(jìn)入動(dòng)畫的初始狀態(tài)并等待動(dòng)畫開始。動(dòng)畫結(jié)束后钧萍,layer會(huì)恢復(fù)到之前的狀態(tài)
kCAFillModeBoth 這個(gè)其實(shí)就是上面兩個(gè)的合成.動(dòng)畫加入后開始之前褐缠,layer便處于動(dòng)畫初始狀態(tài),動(dòng)畫結(jié)束后layer保持動(dòng)畫最后的狀態(tài),不過要配合removedOnCompletion屬性設(shè)置為NO使用才有效果风瘦,不然沒效果
kCAFillModeRemoved 這個(gè)是默認(rèn)值队魏,也就是說當(dāng)動(dòng)畫開始前和動(dòng)畫結(jié)束后,動(dòng)畫對(duì)layer都沒有影響万搔,動(dòng)畫結(jié)束后胡桨,layer會(huì)恢復(fù)到之前的狀態(tài)
timingFunction屬性
- kCAMediaTimingFunctionLinear(線性):勻速,給你一個(gè)相對(duì)靜態(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)畫行為。
- kCAMediaTimingFunctionDefault:默認(rèn)的(線性):勻速
CAAnimation的代理方法
@interface NSObject (CAAnimationDelegate)
/* Called when the animation begins its active duration. */
// 動(dòng)畫開始時(shí)調(diào)用
- (void)animationDidStart:(CAAnimation *)anim;
/* Called when the animation either completes its active duration or
* is removed from the object it is attached to (i.e. the layer). 'flag'
* is true if the animation reached the end of its active duration
* without being removed. */
// 動(dòng)畫結(jié)束后調(diào)用
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag;
@end
2.CAPropertyAnimation
CAPropertyAnimation繼承自CAAnimation,也是一個(gè)抽象類意敛,是CABasicAnimation和CAKeyframeAnimation的父類馅巷,不能直接使用來生成動(dòng)畫效果。
keyPath
通過指定CALayer的一個(gè)屬性名稱為keyPath(NSString類型)草姻,并且對(duì)CALayer的這個(gè)屬性的值進(jìn)行修改钓猬,達(dá)到相應(yīng)的動(dòng)畫效果。
/* Creates a new animation object with its `keyPath' property set to
* 'path'. */
+ (instancetype)animationWithKeyPath:(nullable NSString *)path;
/* The key-path describing the property to be animated. */
@property(nullable, copy) NSString *keyPath;
keyPath類型 | 動(dòng)畫效果 |
---|---|
transform.rotation.z | Z軸旋轉(zhuǎn) |
transform.rotation.x | X軸旋轉(zhuǎn) |
transform.rotation.y | Y軸旋轉(zhuǎn) |
transform.scale.x | 寬的比例轉(zhuǎn)換 |
transform.scale.y | 高的比例轉(zhuǎn)換 |
opacity | 透明度 |
backgroundColor | 背景色 |
anchorPoint | 定位點(diǎn)撩独,錨點(diǎn)敞曹,默認(rèn)中心點(diǎn)(0.5, 0.5) |
borderColor | 邊框顏色 |
borderWidth | 邊框?qū)挾?/td> |
bounds | 大小 |
contents | 內(nèi)容 |
contentsRect | 內(nèi)容矩形 |
cornerRadius | 圓角 |
frame | 位置 |
hidden | 隱藏 |
mask | 標(biāo)記 |
maskToBounds | 切割 |
position | 位置 |
shadowOffset | 陰影偏移 |
shadowColor | 陰影顏色 |
shadowRadius | 陰影角度 |
shadowOpacity | 陰影透明度 |
strokeEnd | 顏色從無到有 |
strokeStart | 顏色從有到無 |
3.CABasicAnimation 基本動(dòng)畫
繼承自CAPropertyAnimation账月,基本動(dòng)畫。主要的效果是keyPath里面的澳迫,指定keyPath相應(yīng)屬性的初始值和keyPath相應(yīng)屬性的結(jié)束值局齿。然后執(zhí)行動(dòng)畫。
keyPath類型 | 動(dòng)畫效果 |
---|---|
fromValue | keyPath相應(yīng)屬性的初始值 |
toValue | keyPath相應(yīng)屬性的結(jié)束值 |
動(dòng)畫過程說明:
隨著動(dòng)畫的進(jìn)行橄登,在長(zhǎng)度為duration的持續(xù)時(shí)間內(nèi)抓歼,keyPath相應(yīng)屬性的值從fromValue漸漸地變?yōu)閠oValue。
keyPath內(nèi)容是CALayer的可動(dòng)畫Animatable屬性拢锹。
如果fillMode = kCAFillModeForwards同時(shí)removedOnComletion = NO谣妻,那么在動(dòng)畫執(zhí)行完畢后,圖層會(huì)保持顯示動(dòng)畫執(zhí)行后的狀態(tài)卒稳。但在實(shí)質(zhì)上蹋半,圖層的屬性值還是動(dòng)畫執(zhí)行前的初始值,并沒有真正被改變充坑。
fillMode = kCAFillModeForwards同時(shí)removedOnComletion = NO要同時(shí)設(shè)定才有效
-(void)createCAAnimation
{
//核心動(dòng)畫是作用在CALayer層的减江,所以先創(chuàng)建一個(gè)layer來承載動(dòng)畫
CALayer *layer = [[CALayer alloc] init];
layer.bounds = CGRectMake(0, 0, 100, 100);
//layer沒有center的屬性,而是position
layer.position = self.view.center;
layer.backgroundColor = [[UIColor blackColor]colorWithAlphaComponent:0.5].CGColor;
[self.view.layer addSublayer:layer];
//創(chuàng)建一個(gè)CAAnimation
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
//屬性
//動(dòng)畫持續(xù)的時(shí)間捻爷,默認(rèn)是0 辈灼, animation.duration = 5;
//速度比例,默認(rèn)是1也榄,如果調(diào)節(jié)為n茵休,那么在動(dòng)畫持續(xù)時(shí)間內(nèi)會(huì)加速執(zhí)行n次
animation.speed = 1;
//開始時(shí)間 ,默認(rèn)是0手蝎,若想延遲ns,就設(shè)置為CACurrentMediaTime()+n俐芯,CACurrentMediaTime()為圖層的當(dāng)前時(shí)間
animation.beginTime = 0;
//時(shí)間偏移棵介,用來暫停動(dòng)畫使用
animation.timeOffset = 0;
//動(dòng)畫重復(fù)的次數(shù),默認(rèn)為0吧史,無限循環(huán)可以設(shè)置HUGE_VALF或者M(jìn)AXFLOAT
animation.repeatCount = 0;
//動(dòng)畫重復(fù)的時(shí)間間隔邮辽,默認(rèn)0
animation.repeatDuration = 0;
//倒向動(dòng)畫,默認(rèn)是NO贸营,如果是Yes,動(dòng)畫正向執(zhí)行后吨述,會(huì)倒向執(zhí)行一次
animation.autoreverses = NO;
//默認(rèn)為YES,代表動(dòng)畫執(zhí)行完畢后就從圖層上移除钞脂,圖形會(huì)恢復(fù)到動(dòng)畫執(zhí)行前的狀態(tài)揣云。如果想讓圖層保持顯示動(dòng)畫執(zhí)行后的狀態(tài),那就設(shè)置為NO冰啃,不過還要設(shè)置fillMode為kCAFillModeForwards
animation.removedOnCompletion = YES;
//決定動(dòng)畫開始之前或者結(jié)束之后的形態(tài)
animation.fillMode = kCAFillModeRemoved;
//速度控制函數(shù)邓夕,控制動(dòng)畫運(yùn)行的節(jié)奏
CAMediaTimingFunction *timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
animation.timingFunction = timingFunction;
//開始
animation.fromValue = @(M_PI);
//結(jié)束
animation.toValue = @(M_PI/4);
//為layer加上動(dòng)畫
[layer addAnimation:animation forKey:@"ANIMATION"];
}
4. CAKeyframeAnimation 關(guān)鍵幀動(dòng)畫
和CABasicAnimation一樣繼承自CAPropertyAnimation刘莹,可以理解為CABasicAnimation的升級(jí)版。
- CABasicAnimation只能指定首尾兩個(gè)keyPath,然后動(dòng)畫從fromValue執(zhí)行到toValue焚刚。
- CAKeyframeAnimation可以指定動(dòng)畫的keypath到一個(gè)values數(shù)組中点弯,然后依次執(zhí)行。
屬性 | 說明 |
---|---|
values | NSArray對(duì)象矿咕。里面的元素稱為“關(guān)鍵幀”(keyframe)抢肛。動(dòng)畫對(duì)象會(huì)在指定的時(shí)間(duration)內(nèi),依次顯示values數(shù)組中的每一個(gè)關(guān)鍵幀 |
path | 可以設(shè)置一個(gè)CGPathRef碳柱、CGMutablePathRef捡絮,讓圖層按照路徑軌跡移動(dòng)。path只對(duì)CALayer的anchorPoint和position起作用士聪。如果設(shè)置了path锦援,那么values將被忽略 |
keyTimes | 可以為對(duì)應(yīng)的關(guān)鍵幀指定對(duì)應(yīng)的時(shí)間點(diǎn),每個(gè)動(dòng)畫的時(shí)長(zhǎng)剥悟,總時(shí)長(zhǎng)為1灵寺,然后運(yùn)動(dòng)到那個(gè)點(diǎn)是,該點(diǎn)在總時(shí)長(zhǎng)的百分之幾,和valus個(gè)數(shù)相同区岗,keyTimes中的每一個(gè)時(shí)間值都對(duì)應(yīng)values中的每一幀略板。如果沒有設(shè)置keyTimes,各個(gè)關(guān)鍵幀的時(shí)間是平分的 |
timingFunctions | 每個(gè)幀的運(yùn)動(dòng)類型慈缔,NSArray中存放CAMediaTimingFunction對(duì)象叮称,個(gè)數(shù)要比values中的少一個(gè)。因?yàn)閯?dòng)畫的真實(shí)個(gè)數(shù)要比設(shè)置的value少一個(gè)藐鹤。 |
calculationMode | 該屬性決定了物體在每個(gè)子路徑下是跳著走還是勻速走瓤檐,跟timeFunctions屬性有點(diǎn)類似 |
rotationMode |
calculationMode
- kCAAnimationLinear//線性,默認(rèn)
- kCAAnimationDiscrete//離散娱节,無中間過程挠蛉,但keyTimes設(shè)置的時(shí)間依舊生效,物體跳躍地出現(xiàn)在各個(gè)關(guān)鍵幀上
- kCAAnimationPaced//平均肄满,keyTimes跟timeFunctions失效
- kCAAnimationCubic//平均谴古,同上
- kCAAnimationCubicPaced//平均,同上
rotationMode
- kCAAnimationRotateAuto
- kCAAnimationRotateAutoReverse
-(void)createValuesAnimation
{
CAKeyframeAnimation *keyframeAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
//設(shè)置路徑
keyframeAnimation.values = [[NSArray alloc] initWithObjects:
[NSValue valueWithCGPoint:CGPointMake(self.view.center.x, self.view.center.y)],
[NSValue valueWithCGPoint:CGPointMake(self.view.frame.size.width-25, self.view.center.y)],
[NSValue valueWithCGPoint:CGPointMake(self.view.frame.size.width-25, self.view.frame.origin.y+89)],
[NSValue valueWithCGPoint:CGPointMake(self.view.frame.origin.x+25, self.view.frame.origin.y+89)],
[NSValue valueWithCGPoint:CGPointMake(self.view.frame.origin.x+25, self.view.center.y)],
[NSValue valueWithCGPoint:CGPointMake(self.view.frame.origin.x+25, self.view.frame.size.height-25)],
[NSValue valueWithCGPoint:CGPointMake(self.view.frame.size.width-25, self.view.frame.size.height-25)],
[NSValue valueWithCGPoint:CGPointMake(self.view.center.x, self.view.center.y)],
nil];
//整個(gè)動(dòng)畫的時(shí)長(zhǎng)
keyframeAnimation.duration = 10;
//每個(gè)動(dòng)畫的時(shí)長(zhǎng)稠歉,總時(shí)長(zhǎng)為1掰担,然后運(yùn)動(dòng)到那個(gè)點(diǎn)是,該點(diǎn)在總時(shí)長(zhǎng)的百分之幾,和valus個(gè)數(shù)相同
keyframeAnimation.keyTimes = @[@(0),@(0.2),@(0.4),@(0.5),@(0.55),@(0.7),@(0.9),@(1)];
keyframeAnimation.repeatCount = MAXFLOAT;
[self.layer addAnimation:keyframeAnimation forKey:nil];
[self.view.layer addSublayer:self.layer];
}
-(void)createPathAnimation
{
CAKeyframeAnimation *keyframeAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
//創(chuàng)建一個(gè)路徑
CGMutablePathRef path = CGPathCreateMutable();
//添加圓形
//CGPathAddEllipseInRect(path, NULL, CGRectMake(50, 90, 200, 200));
//矩形
CGPathAddRect(path, NULL, CGRectMake(50, 90, 200, 200));
//設(shè)置路徑
keyframeAnimation.path = path;
//釋放路徑
CGPathRelease(path);
//設(shè)置動(dòng)畫時(shí)間
keyframeAnimation.duration = 3;
//原路線返回
// keyframeAnimation.autoreverses = YES;
keyframeAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
//設(shè)置重復(fù)次數(shù)
keyframeAnimation.repeatCount = MAXFLOAT;
//勻速kCAAnimationCubicPaced
keyframeAnimation.calculationMode = kCAAnimationCubicPaced;
[self.layer addAnimation:keyframeAnimation forKey:nil];
[self.view.layer addSublayer:self.layer];
}
5.CATransition 轉(zhuǎn)場(chǎng)動(dòng)畫
繼承自CAAnimation,切換頁面的動(dòng)畫怒炸。
屬性 | 說明 |
---|---|
type | 動(dòng)畫類型下面會(huì)列出各種類型 |
subtype | 方向 |
startProgress | 從什么地方開始動(dòng)畫带饱,默認(rèn)動(dòng)畫0到1 |
endProgress | 從什么地方結(jié)束動(dòng)畫,默認(rèn)動(dòng)畫0到1 |
type | 說明 |
---|---|
開放的四種基本效果 | |
kCATransitionPush | 推入效果 |
kCATransitionMoveIn | 移入效果 |
kCATransitionReveal | 截開效果 |
kCATransitionFade | 漸入漸出效果 |
私有的效果 | |
cube | 方塊 |
suckEffect | 三角 |
rippleEffect | 水波抖動(dòng) |
pageCurl | 上翻頁 |
pageUnCurl | 下翻頁 |
oglFlip | 上下翻轉(zhuǎn) |
cameraIrisHollowOpen | 鏡頭快門開 |
cameraIrisHollowClose | 鏡頭快門關(guān) |
subtype的類型
- kCATransitionFromRight 從右邊開始
- kCATransitionFromLeft 從左邊來時(shí)
- kCATransitionFromTop 從上面開始
- kCATransitionFromBottom 從下面開始
- (void)push
{
//創(chuàng)建一個(gè)轉(zhuǎn)場(chǎng)動(dòng)畫
CATransition *stansition = [CATransition animation];
//設(shè)置動(dòng)畫時(shí)間
stansition.duration = 1;
//設(shè)置類型
stansition.type = @"cube";
stansition.subtype = kCATransitionFromRight;
//添加動(dòng)畫
[self.navigationController.view.layer addAnimation:stansition forKey:nil];
NextViewController *nextVC = [[NextViewController alloc] init];
[self.navigationController pushViewController:nextVC animated:YES]阅羹;
}
6.CAAnimationGroup 動(dòng)畫組
多個(gè)動(dòng)畫的組合纠炮,即可以把多個(gè)動(dòng)畫放在animations數(shù)組中月趟,然后同時(shí)執(zhí)行多個(gè)動(dòng)畫。
-(void)createAnimationGroup
{
//創(chuàng)建一個(gè)動(dòng)畫組
CAAnimationGroup *animationGroup = [[CAAnimationGroup alloc] init];
//動(dòng)畫時(shí)間恢口,如果動(dòng)畫組中的時(shí)間沒有設(shè)置是不行的孝宗,如果設(shè)置了動(dòng)畫組的時(shí)間,然后里面的動(dòng)畫沒有設(shè)置時(shí)間耕肩, 那么則以動(dòng)畫組的時(shí)間為準(zhǔn)因妇,如果里面的具體動(dòng)畫也設(shè)置了時(shí)間,那么以具體的動(dòng)畫設(shè)置的時(shí)間為準(zhǔn)
animationGroup.duration = 10;
//創(chuàng)建一個(gè)基礎(chǔ)動(dòng)畫
CABasicAnimation *basicAnimaiton = [CABasicAnimation animationWithKeyPath:@"transform.rotation.x"];
basicAnimaiton.toValue = @(M_PI);
//創(chuàng)建一個(gè)幀動(dòng)畫
CAKeyframeAnimation *keyframeAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
//設(shè)置路徑
keyframeAnimation.values = [[NSArray alloc] initWithObjects:
[NSValue valueWithCGPoint:CGPointMake(self.view.center.x, self.view.center.y)],
[NSValue valueWithCGPoint:CGPointMake(self.view.frame.size.width-25, self.view.center.y)],
[NSValue valueWithCGPoint:CGPointMake(self.view.frame.size.width-25, self.view.frame.origin.y+89)],
[NSValue valueWithCGPoint:CGPointMake(self.view.frame.origin.x+25, self.view.frame.origin.y+89)],
[NSValue valueWithCGPoint:CGPointMake(self.view.frame.origin.x+25, self.view.center.y)],
[NSValue valueWithCGPoint:CGPointMake(self.view.frame.origin.x+25, self.view.frame.size.height-25)],
[NSValue valueWithCGPoint:CGPointMake(self.view.frame.size.width-25, self.view.frame.size.height-25)],
[NSValue valueWithCGPoint:CGPointMake(self.view.center.x, self.view.center.y)],
nil];
//每個(gè)動(dòng)畫的時(shí)長(zhǎng)猿诸,總時(shí)長(zhǎng)為1婚被,然后運(yùn)動(dòng)到那個(gè)點(diǎn)是,該點(diǎn)在總時(shí)長(zhǎng)的百分之幾,和valus個(gè)數(shù)相同
keyframeAnimation.keyTimes = @[@(0),@(0.2),@(0.4),@(0.5),@(0.55),@(0.7),@(0.9),@(1)];
//將兩個(gè)動(dòng)畫添加到動(dòng)畫組中
animationGroup.animations = @[basicAnimaiton,keyframeAnimation];
[self.layer addAnimation:animationGroup forKey:nil];
[self.view.layer addSublayer:self.layer];
}