CoreAnimation 核心動(dòng)畫

最近總結(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)系娇未。

WechatIMG7.jpeg

下面分一下幾點(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];
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末梳虽,一起剝皮案震驚了整個(gè)濱河市址芯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌窜觉,老刑警劉巖谷炸,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異禀挫,居然都是意外死亡旬陡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門语婴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來描孟,“玉大人,你說我怎么就攤上這事砰左∧湫眩” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵缠导,是天一觀的道長(zhǎng)青抛。 經(jīng)常有香客問我,道長(zhǎng)酬核,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任适室,我火速辦了婚禮嫡意,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘捣辆。我一直安慰自己蔬螟,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開白布汽畴。 她就那樣靜靜地躺著旧巾,像睡著了一般耸序。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鲁猩,一...
    開封第一講書人閱讀 49,784評(píng)論 1 290
  • 那天坎怪,我揣著相機(jī)與錄音,去河邊找鬼廓握。 笑死搅窿,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的隙券。 我是一名探鬼主播男应,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼娱仔!你這毒婦竟也來了沐飘?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤牲迫,失蹤者是張志新(化名)和其女友劉穎耐朴,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體恩溅,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡隔箍,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了脚乡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蜒滩。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖奶稠,靈堂內(nèi)的尸體忽然破棺而出俯艰,到底是詐尸還是另有隱情,我是刑警寧澤锌订,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布竹握,位于F島的核電站,受9級(jí)特大地震影響辆飘,放射性物質(zhì)發(fā)生泄漏啦辐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一蜈项、第九天 我趴在偏房一處隱蔽的房頂上張望芹关。 院中可真熱鬧,春花似錦紧卒、人聲如沸侥衬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽轴总。三九已至直颅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間怀樟,已是汗流浹背功偿。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留漂佩,地道東北人脖含。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像投蝉,于是被迫代替她去往敵國(guó)和親养葵。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 1. 簡(jiǎn)介 Core Animation 中文翻譯為核心動(dòng)畫瘩缆,它是一組非常強(qiáng)大的動(dòng)畫處理API关拒,使用它能做出非常炫...
    lltree閱讀 637評(píng)論 2 6
  • demo 地址[https://github.com/liumingzhi/CoreAnimation] 內(nèi)容 關(guān)...
    苦工閱讀 8,391評(píng)論 5 23
  • Core Animation Core Animation,中文翻譯為核心動(dòng)畫庸娱,它是一組非常強(qiáng)大的動(dòng)畫處理API着绊,...
    45b645c5912e閱讀 3,016評(píng)論 0 21
  • CoreAnimation 前段時(shí)間接觸到了一個(gè)牛逼的動(dòng)畫框架POP,本來想來裝裝逼,突然發(fā)現(xiàn),蘋果大大的Core...
    TitanCoder閱讀 2,143評(píng)論 0 6
  • 夜已經(jīng)深了,還在車廂里值班的我熟尉。感覺莫名的寂聊归露。列車運(yùn)行在返成的途中,車廂里的人很少斤儿,乘客們也都進(jìn)入了甜蜜的夢(mèng)鄉(xiāng)剧包,...
    碎花裙ztt閱讀 263評(píng)論 0 0