ios史上最詳細的動畫講解-加載等待動畫(一)

前言

本文主要面向的對象是那些沒有動畫基礎(chǔ)的入門引導,提供一個學習動畫的正確途徑,并且配以項目實戰(zhàn)的效果的重點講解。

正文

這篇文章要實現(xiàn)的效果如下圖

效果圖

實現(xiàn)這個效果需要了解基本概念
http://www.cnblogs.com/mjios/tag/objective-c/default.html?page=2
這個是明杰大神的入門講解,

基礎(chǔ)

你需要從這幾篇文章中了解到以下的知識點

  • UIViewCALayer之間的關(guān)系(區(qū)別和聯(lián)系)
  • Core Animation框架中使用的類
  • CALayerCore Animation之間的聯(lián)系
  • CAAnimation的常用屬性

如果你對這些基本的知識點已經(jīng)全部理清楚,那么接下來你就可以繼續(xù)往下看了,我們實現(xiàn)動畫主要需要學習的類庫QuartzCore,首先看一下這個類庫

QuartzCore

首先有我們熟悉的CALayer``CAAnimation,對于從來沒有做過動畫的朋友來說,其他的類就不清楚了。下面我就簡單介紹一下主要的類之間關(guān)系,以及單獨類主要實現(xiàn)什么。

  • CAAnimation.h主要是各類動畫的基類,我們一般不會使用它來做動畫。基本常用屬性
//公有屬性定義動畫的節(jié)奏
@property(nullable, strong) CAMediaTimingFunction *timingFunction;
//代理,例如捕捉動畫的開始,動畫的結(jié)束等
@property(nullable, strong) id delegate;
//動畫執(zhí)行完是否移除
@property(getter=isRemovedOnCompletion) BOOL removedOnCompletion;
  • CABase.h可以忽略不看,是一些基本的配置

  • CADisplayLink.h幀動畫,默認添加定時器,每秒刷多少幀,在gitHub上有facebook出品的一個pop動畫,據(jù)說是居于幀動畫
    https://github.com/facebook/pop

  • CAEAGLLayer是和<OpenGLES/EAGLDrawable.h>這個框架聯(lián)合使用的,暫時用不到。

  • CAEmitter相關(guān)的是粒子動畫,可以實現(xiàn)很多酷炫的效果

  • CAShapeLayer非常重要的一個類,常常與UIKit框架的UIBezierPath貝塞爾曲線聯(lián)合使用,繪制曲線,圓形,各種復雜的圖形都會使用到,非常非常重要,我的上一篇文章就是他們兩個的結(jié)合

  • CAGradientLayer常見應用于鎖屏底部閃爍的滑動來解鎖。

  • CAReplicatorLayer 它獨有的特性是,其子類具有相同的屬性,這篇文章主要是它的應用。

其他的類,我是沒有使用過,所以不做講解。

下面我們看就上述動畫講解一個最簡單,三個點加載動畫,作為入門。

    CAReplicatorLayer *replicatorLayer = [CAReplicatorLayer layer];
    replicatorLayer.bounds          = CGRectMake(0, 0, 100, 100);
    replicatorLayer.cornerRadius    = 10.0;
    replicatorLayer.position        =  self.view.center;
    replicatorLayer.backgroundColor = [UIColor colorWithRed:0.1 green:0.1 blue:0.1 alpha:0.2].CGColor;

[self.view.layer addSublayer:replicatorLayer];

那么我們會看到這個效果

replicatorLayer

接下來我們需要添加點

CALayer *dotLayer        = [CALayer layer];
    dotLayer.bounds          = CGRectMake(0, 0, 15, 15);
    dotLayer.position        = CGPointMake(15, replicatorLayer.frame.size.height/2 );
    dotLayer.backgroundColor = [UIColor colorWithRed:0.1 green:0.1 blue:0.1 alpha:0.6].CGColor;
    dotLayer.cornerRadius    = 7.5;
    
    [replicatorLayer addSublayer:dotLayer];

效果圖

接下來我們會想在創(chuàng)建兩個點,然后做動畫就可以,不錯這是一種可實現(xiàn)的思路,可以如果我們要做第一中類似旋轉(zhuǎn)的動畫,我們需要創(chuàng)建10個點,難道我們一個個去創(chuàng)建嗎?我們現(xiàn)在使用的是CAReplicatorLayer,它有個屬性instanceCount,是子類的個數(shù),然后我們設置每個子類的位置即可

在上述代碼添加

    replicatorLayer.instanceCount = 3;
    replicatorLayer.instanceTransform = CATransform3DMakeTranslation(replicatorLayer.frame.size.width/3, 0, 0);

效果


需要說明的是instanceTransform這個屬性,它的作用是設置每個子Layer如何變化。CATransform3DMakeTranslation這個類的含義是使Layer根據(jù)X、Y、Z軸進行平移。我們需要的是平移,所以使用translation這個屬性,如果我們是第一種圓形排放,那么我們需要這樣設置

    CGFloat count                     =  10.0;
    replicatorLayer.instanceCount     = count;
    CGFloat angel                     = 2* M_PI/count;
    replicatorLayer.instanceTransform = CATransform3DMakeRotation(angel, 0, 0, 1);

解釋一下CATransform3DMakeRotation,它是CATransform3D的一個結(jié)構(gòu)(矩陣結(jié)構(gòu)),含義是使Layer在X、Y、Z軸根據(jù)給定的角度旋轉(zhuǎn)。我們需要平面旋轉(zhuǎn)則坐標系為(0,0,1)。
看效果


接下來我們需要添加動畫

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
    animation.duration    = 1.0;
    animation.fromValue   = @1;
    animation.toValue     = @0;
    animation.repeatCount = MAXFLOAT;
    [dotLayer addAnimation:animation forKey:nil];

編譯運行看效果:


這不是我們需要的真實效果,我們還需要設置每一個sublayerinstanceDelay屬性。

replicatorLayer.instanceDelay = 1.0/3;

編譯運行看效果


我們會發(fā)現(xiàn)動畫在開始前會有不流暢效果,我們應該給dotLayer一個初始的大小

dotLayer.transform = CATransform3DMakeScale(0, 0, 0);

這樣我們就能實現(xiàn)這個比較簡單的等待動畫效果。

下面我們總結(jié)一下實現(xiàn)這個動畫的步驟:

  • 1.首先創(chuàng)建一個可復用的CAReplicatorLayer,創(chuàng)建這個的目的是為了我添加的子類可以復用,一勞永逸;

  • 2.添加子Layer,設置子Layer所需要的樣式;

  • 3.將子layer添加到CAReplicatorLayer上,并設置子layer個數(shù)和排布;

  • 4.給子layer添加動畫效果,特別提醒一點transform一般針對的是縮放和旋轉(zhuǎn)動畫,當然也可以實現(xiàn)平移動畫。

下面我總結(jié)一下常用動畫的 keyPath

transform.rotation:旋轉(zhuǎn)動畫。
transform.rotation.x:按x軸旋轉(zhuǎn)動畫。
transform.rotation.y:按y軸旋轉(zhuǎn)動畫。
transform.rotation.z:按z軸旋轉(zhuǎn)動畫。
transform.scale:按比例放大縮小動畫。
transform.scale.x:在x軸按比例放大縮小動畫。
transform.scale.y:在y軸按比例放大縮小動畫。
transform.scale.z:在z軸按比例放大縮小動畫。
position:移動位置動畫。
opacity:透明度動畫。

最后向大家再分享一個閃爍的動畫,本來這是一篇單獨的文章,投稿首頁已經(jīng)通過審核,結(jié)果本人手賤不小心給刪除了這篇文章,所以在這篇文章補上,這里只附swift代碼,oc代碼demo中查看。
首先我們看一下效果:


閃爍動畫的實現(xiàn)主要是通過改變透明度,從而達成閃爍的效果,我將這個方法寫成了一個分類,給CABasicAnimation添加一個分類,具體代碼如下

import UIKit

class catergory: CABasicAnimation {

    
   class func opacityForever_Animation(time : NSTimeInterval) -> CABasicAnimation {
        
        
        let animation = CABasicAnimation(keyPath:"opacity")
        animation.fromValue = 1
        animation.toValue = 0
        animation.duration = time
        animation.autoreverses = true
        animation.removedOnCompletion = false
        animation.fillMode = kCAFillModeForwards
        animation.timingFunction = CAMediaTimingFunction.init(name: kCAMediaTimingFunctionEaseIn)

        return animation
    }

}

這樣我們在外部可以給任何一個UIView添加閃爍動畫。

結(jié)尾

本文具體實現(xiàn)的代碼上傳gitHub,demo中對這些動畫進行了簡單的封裝,一是為了提高代碼的質(zhì)量和可讀性,二是為了更符合項目實戰(zhàn),希望你在閱讀的時候提出寶貴的意見,當然也歡迎你的Star。
下一篇文章主要是想分享一下CAShapeLayer和貝塞爾曲線結(jié)合的例子,當然你有更好的動畫效果希望你能私信推薦給我,我會選擇一些好的實現(xiàn)并分享。
https://github.com/markdashi/LoadingAnimation

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,119評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,382評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,038評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,853評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,616評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,112評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,192評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,355評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,869評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,727評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,928評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,467評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,165評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,570評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,813評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,585評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,892評論 2 372

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

  • 在iOS中隨處都可以看到絢麗的動畫效果,實現(xiàn)這些動畫的過程并不復雜,今天將帶大家一窺ios動畫全貌。在這里你可以看...
    每天刷兩次牙閱讀 8,541評論 6 30
  • Core Animation Core Animation,中文翻譯為核心動畫,它是一組非常強大的動畫處理API,...
    45b645c5912e閱讀 3,045評論 0 21
  • 在iOS中隨處都可以看到絢麗的動畫效果,實現(xiàn)這些動畫的過程并不復雜,今天將帶大家一窺iOS動畫全貌。在這里你可以看...
    F麥子閱讀 5,130評論 5 13
  • 轉(zhuǎn)載:http://www.lxweimin.com/p/32fcadd12108 每個UIView有一個伙伴稱為l...
    F麥子閱讀 6,255評論 0 13
  • 每個UIView有一個伙伴稱為layer,一個CALayer。UIView實際上并沒有把自己畫到屏幕上;它繪制本身...
    shenzhenboy閱讀 3,131評論 0 17