iOS動畫系列之四:基礎動畫之平移篇

第一篇:iOS動畫系列之一:通過實戰(zhàn)學習CALayer和透視的原理凯旭。做一個帶時分秒指針的時鐘動畫(上)
第二篇:iOS動畫系列之二:通過實戰(zhàn)學習CALayer和透視的原理萤厅。做一個帶時分秒指針的時鐘動畫入录。包含了OC和Swift兩種源代碼(下)
第三篇:iOS動畫系列之三:Core Animation来涨。介紹了Core Animation的常用屬性和方法塔橡。
第四篇:CABasic Animation梅割。iOS動畫系列之四:基礎動畫之平移篇
第五篇:CABasic Animation。iOS動畫系列之五:基礎動畫之縮放篇&旋轉篇
第六篇:iOS動畫系列之六:利用CABasic Animation完成帶動畫特效的登錄界面
第七篇:iOS動畫系列之七:實現類似Twitter的啟動動畫
第八篇:iOS動畫系列之八:使用CAShapeLayer繪畫動態(tài)流量圖
第九篇:iOS動畫系列之九:實現點贊的動畫及播放起伏指示器
第十篇:實戰(zhàn)系列:繪制過山車場景

就像咱們之前說的葛家,所有的動畫都是在CALayer上面的户辞。所以在做動畫之前我們就要先建立一個CALayer,然后把動畫作用在自己創(chuàng)建的這個CALayer上癞谒。如果不知道CALyer是啥底燎,可以看看前面的分享哈。傳輸門:第一篇:iOS動畫系列之一:通過實戰(zhàn)學習CALayer和透視的原理弹砚。做一個帶時分秒指針的時鐘動畫(上)

最終實現的效果:

基礎動畫之平移效果

1. 基礎版的平移

這里重點是為了演示fromValue/toValue 双仍、 設置layer的Position位置、實現代理方法里面設置position的區(qū)別桌吃。

最終實現的效果:

BasicAnimation.gif

步驟如下:
1, 創(chuàng)建CALayer朱沃。
2, 設置CALayer的位置、大小、背景顏色逗物。
3, 將自定義的CALayer添加到主視圖的view上面搬卒。
4, 實例化一個CABasicAnimation對象。
5, 設置動畫屬性為平移翎卓。
6, 設置動畫的起始位置契邀,從哪里到哪里。
7莲祸,設置動畫的持續(xù)時間蹂安、填充模式、重復次數锐帜、設置代理。
8, 將動畫添加到需要作用的CALayer上面畜号。
9, 實現<CAAnimationDelegate>的代理方法:動畫開始時調用的方法缴阎、動畫結束時調用的方法。

//遵守動畫的代理協議
@interface STBasicPositionViewController ()<CAAnimationDelegate>
@property(weak,nonatomic)CALayer * redLayer;

@end

@implementation STBasicPositionViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //創(chuàng)建CALayer
    CALayer *redLayer = [CALayer layer];
    
    //設置位置和大小
    redLayer.position = CGPointMake(200, 200);
    redLayer.bounds = CGRectMake(0, 0, 100, 100);
    
    
    //設置背景顏色
    redLayer.backgroundColor = [UIColor redColor].CGColor;
    
    //把layer添加到UIView的layer上
    [self.view.layer addSublayer:redLayer];
    
    self.redLayer = redLayer;
    
    
    /*------------開始設置動畫------------------------*/
    
    //創(chuàng)建動畫對象
    CABasicAnimation *basicAni = [CABasicAnimation animation];
    
    //設置動畫屬性
    basicAni.keyPath = @"position";
    
    //設置動畫的起始位置简软。也就是動畫從哪里到哪里
    basicAni.fromValue = [NSValue valueWithCGPoint:CGPointMake(0, 0)];
    
    //動畫結束后蛮拔,layer所在的位置
    basicAni.toValue = [NSValue valueWithCGPoint:CGPointMake(300, 300)];
    
    
    //動畫持續(xù)時間
    basicAni.duration = 2;
    
    //動畫填充模式
    basicAni.fillMode = kCAFillModeForwards;
    
    //動畫完成不刪除
    basicAni.removedOnCompletion = NO;
    
    //xcode8.0之后需要遵守代理協議
    basicAni.delegate = self;
    
    //把動畫添加到要作用的Layer上面
    [self.redLayer addAnimation:basicAni forKey:nil];
 
}


#pragma 實現代理協議的方法

//動畫開始的時候調用
- (void)animationDidStart:(CAAnimation *)anim{
    
    self.redLayer.position = CGPointMake(300, 100);
    
}

//動畫結束的時候調用
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag{
    
    self.redLayer.position = CGPointMake(300, 400);
}


@end

2. 創(chuàng)建不同速度控制的動畫

上面代碼里面我們看到了有一些莫名其妙出來的字符串,例如在設置動畫屬性的時候出來的:

    //設置動畫屬性
    basicAni.keyPath = @"position";

    //動畫填充模式
    basicAni.fillMode = kCAFillModeForwards;

這些屬性痹升,在前一篇很枯燥的分享里面有提到建炫。有需要的童鞋可以點進去當作字典翻一下。也沒有啥記憶的必要性疼蛾,需要的時候查一下肛跌,需要的時候查一下就好了。傳輸門:第三篇:iOS動畫系列之三:Core Animation察郁。介紹了Core Animation的常用屬性和方法衍慎。

速度控制一共有四種模式:

kCAMediaTimingFunctionLinear(線性):勻速,給你一個相對靜態(tài)的感覺
kCAMediaTimingFunctionEaseIn(漸進):動畫緩慢進入皮钠,然后加速離開
kCAMediaTimingFunctionEaseOut(漸出):動畫全速進入稳捆,然后減速的到達目的地
kCAMediaTimingFunctionEaseInEaseOut(漸進漸出):動畫緩慢的進入,中間加速麦轰,然后減速的到達目的地乔夯。這個是默認的動畫行為。

2.1 抽取創(chuàng)建Layer及動畫的公共方法

為了能夠偷點懶款侵,所以抽取了公共的方法末荐。可以很方便的創(chuàng)建Layer以及動畫喳坠。哈哈鞠评,本宅胖要是不懶就不會這么胖了。

#pragma 抽取創(chuàng)建動畫及Layer的公共方法

//創(chuàng)建CALayer
- (CALayer *)createLayerWithPosition:(CGPoint)position backgroundColor:(UIColor *)backgroundColor{
    //創(chuàng)建CALayer
    CALayer *layer = [CALayer layer];
    
    //設置位置和大小
    layer.position = position;
    layer.bounds = CGRectMake(0, 0, 100, 100);
    
    
    //設置背景顏色
    layer.backgroundColor = backgroundColor.CGColor;
    
    //把layer添加到UIView的layer上
    [self.view.layer addSublayer:layer];
    
    return layer;
}

//創(chuàng)建動畫
- (CABasicAnimation *)createBasicAnimationWithFromValue:(CGPoint)fromValue toValue:(CGPoint)toValue timingFunction:(NSString *)timingFunction{
    //創(chuàng)建動畫對象
    CABasicAnimation *basicAni = [CABasicAnimation animation];
    
    //設置動畫屬性
    basicAni.keyPath = @"position";
    
    //設置動畫的起始位置壕鹉。也就是動畫從哪里到哪里
    basicAni.fromValue = [NSValue valueWithCGPoint:fromValue];
    
    //動畫結束后剃幌,layer所在的位置
    basicAni.toValue = [NSValue valueWithCGPoint:toValue];
    
    //動畫持續(xù)時間
    basicAni.duration = 2;
    
    //動畫重復次數
    basicAni.repeatCount = CGFLOAT_MAX;
    
    //xcode8.0之后需要遵守代理協議
    basicAni.delegate = self;
    
    basicAni.timingFunction = [CAMediaTimingFunction functionWithName:timingFunction];

    return basicAni;
}

2.2 創(chuàng)建Layer和動畫

這里我們只創(chuàng)建一個為例聋涨。

    //    創(chuàng)建紅色線性運動的Layer
    self.redLayer = [self createLayerWithPosition:CGPointMake(0, 150) backgroundColor:[UIColor redColor]];
    [self.redLayer addAnimation:[self createBasicAnimationWithFromValue:CGPointMake(0, 150) toValue:CGPointMake(300, 150) timingFunction:kCAMediaTimingFunctionLinear] forKey:@"linear"];

有朋友可能發(fā)現了,為啥添加動畫的時候后面的forKey怎么不是之前的nil了呢负乡?
這里添加一個key值牍白,實際上是為這個動畫對象起了一個名字,通過key值抖棘,可以很方便的取到這個動畫對象

2.3 移除動畫

動畫播放完成之后茂腥,我們通過key值將這個動畫移除掉。
這個方法當然是在動畫結束的時候調用最合適切省,不然動畫還沒放完就移除了豈不是開天窗啦~
CAAnimationDelegate這個里面的代理方法終于起到作用了最岗。

//動畫結束的時候調用
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag{
    [self.redLayer removeAnimationForKey:@"linear"];
    
    [self.blueLayer removeAnimationForKey:@"easeIn"];

    [self.grayLayer removeAnimationForKey:@"easeOut"];

    [self.greenLayer removeAnimationForKey:@"easeInAndEaseOut"];

}

3. Swift版本的部分差異

Swift版本幾乎和OC的一模一樣。略有不同的是朝捆,swift在加載layer的時候般渡,我們使用了懶加載的方式。也就是在使用的時候才去創(chuàng)建這個layer芙盘。

源代碼也放在了碼云上面驯用。

    //MARK: - 懶加載

    private lazy var redLayer: CALayer = {
        let layer = self.createLayer(position: CGPoint(x: 0, y: 150), backgroundColor: UIColor.red)
        
        return layer
    }()

今天就到這里啦∪謇希看樣子宏圖偉業(yè)打算一篇寫完的CABasic Animation是沒戲啦蝴乔。下一篇文章寫縮放這些的吧。任性的技術宅驮樊。哈哈~

喜歡的話就點個贊唄薇正,或者賞俺點口糧。么么噠~愛你們~

OC和Swift的下載地址如下:
https://git.oschina.net/atypical/CABasic-Animation.git

iOS實踐:CABasic-Animation(OC和Swift兩版)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末巩剖,一起剝皮案震驚了整個濱河市铝穷,隨后出現的幾起案子,更是在濱河造成了極大的恐慌佳魔,老刑警劉巖曙聂,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異鞠鲜,居然都是意外死亡宁脊,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門贤姆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來榆苞,“玉大人,你說我怎么就攤上這事霞捡∽” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長赊琳。 經常有香客問我街夭,道長,這世上最難降的妖魔是什么躏筏? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任板丽,我火速辦了婚禮,結果婚禮上趁尼,老公的妹妹穿的比我還像新娘埃碱。我一直安慰自己,他們只是感情好酥泞,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布砚殿。 她就那樣靜靜地躺著,像睡著了一般芝囤。 火紅的嫁衣襯著肌膚如雪瓮具。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天凡人,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛铛纬,可吹牛的內容都是我干的幼驶。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼怔檩,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起启上,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎店印,沒想到半個月后冈在,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡按摘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年包券,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炫贤。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡溅固,死狀恐怖,靈堂內的尸體忽然破棺而出兰珍,到底是詐尸還是另有隱情侍郭,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站亮元,受9級特大地震影響猛计,放射性物質發(fā)生泄漏。R本人自食惡果不足惜苹粟,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一有滑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧嵌削,春花似錦毛好、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至艇劫,卻和暖如春吼驶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背店煞。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工蟹演, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人顷蟀。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓酒请,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鸣个。 傳聞我的和親對象是個殘疾皇子羞反,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內容

  • 發(fā)現 關注 消息 iOS 第三方庫、插件囤萤、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,094評論 4 62
  • 在iOS中隨處都可以看到絢麗的動畫效果昼窗,實現這些動畫的過程并不復雜,今天將帶大家一窺ios動畫全貌涛舍。在這里你可以看...
    每天刷兩次牙閱讀 8,485評論 6 30
  • 那時候我們的日子 單純而又快樂 我們在一起笑 在一起玩 一起帶上家人出門旅游 你讓我感受到了 即便是趴在海邊的沙灘...
    十六夜薔薇1閱讀 208評論 0 2
  • 隔壁老王澄惊,最近看著心情不太好,滿臉愁容做盅,本來很樂觀的一個人缤削,見面熱情打招呼,誰家要是有事吹榴,鄰里街坊的亭敢,二話不...
    梨落2016閱讀 360評論 0 0
  • 一中門口,偶爾有個賣打口碟的小販图筹,可能可以被叫做大叔帅刀,但不是我們女生所以為的那種大叔让腹,穿著特土,瘦瘦小小扣溺,就是小販...