Swift3.0 一些動畫基礎整理

在項目當中經常看到一些非常好看的動畫,于是乎自己也利用了一下業余時間把這塊東西整理

先看一個簡單的結構圖


animation.png

CAAnimation本身不能使用,需要使用他的子類。

  • CAPropertyAnimation 屬性動畫 (本身也不能使用,要使用它的子類)
  • CAAnimationGroup 組動畫
  • CATransition 轉場動畫,系統就是使用在這個來做轉場動畫效果處理的

一、CAPropertyAnimation之CABaseAnimaiton

因為CAAnimaiton是對Layer進行動畫,屬性動畫顧名思義就是對Layer的屬性進行動畫。
在CABaseAnimation中常用的屬性介紹:

屬性介紹.png


具有動畫效果的KeyPath有

圖片.png


代碼如下:

class func baseAnimationWithKeyPath(_ path : String , fromValue : Any? , toValue : Any?, duration : CFTimeInterval, repeatCount : Float? , timingFunction : String?) -> CABasicAnimation{
        
        let animate = CABasicAnimation(keyPath: path)
        //起始值
        animate.fromValue = fromValue;
        
        //變成什么,或者說到哪個值
        animate.toValue = toValue
        
        //所改變屬性的起始改變量 比如旋轉360°,如果該值設置成為0.5 那么動畫就從180°開始
        //        animate.byValue =
        
        //動畫結束是否停留在動畫結束的位置
        //        animate.isRemovedOnCompletion = false
        
        //動畫時長
        animate.duration = duration
        
        //重復次數 Float.infinity 一直重復 OC:HUGE_VALF
        animate.repeatCount = repeatCount ?? 0
        
        //設置動畫在該時間內重復
        //        animate.repeatDuration = 5
        
        //延時動畫開始時間,使用CACurrentMediaTime() + 秒(s)
        //        animate.beginTime = CACurrentMediaTime() + 2;
        
        //設置動畫的速度變化
        /*
        kCAMediaTimingFunctionLinear: String        勻速
        kCAMediaTimingFunctionEaseIn: String        先慢后快
        kCAMediaTimingFunctionEaseOut: String       先快后慢
        kCAMediaTimingFunctionEaseInEaseOut: String 兩頭慢,中間快
        kCAMediaTimingFunctionDefault: String       默認效果和上面一個效果極為類似,不易區分
         */
        
        animate.timingFunction = CAMediaTimingFunction(name: timingFunction ?? kCAMediaTimingFunctionEaseInEaseOut)
        
        
        //動畫在開始和結束的時候的動作
        /*
         kCAFillModeForwards    保持在最后一幀,如果想保持在最后一幀,那么isRemovedOnCompletion應該設置為false
         kCAFillModeBackwards   將會立即執行第一幀,無論是否設置了beginTime屬性
         kCAFillModeBoth        該值是上面兩者的組合狀態
         kCAFillModeRemoved     默認狀態,會恢復原狀
         */
        animate.fillMode = kCAFillModeBoth
        
        //動畫結束時,是否執行逆向動畫
        //        animate.autoreverses = true
        
        return animate
        
    }

實例圖:


aniChange.gif
aniPosition.gif
aniRotation.gif
aniScale.gif
aniSize.gif


二、CAPropertyAnimation之CAKeyframeAnimation

關鍵幀動畫屬性介紹

圖片.png


代碼

class func keyFrameAnimationWithKeyPath(_ keyPath : String , values : [Any]? , keyTimes : [NSNumber]? , path : CGPath? , duration : CFTimeInterval , cacluationMode : String , rotationMode : String?) -> CAKeyframeAnimation{
        
        let keyFrame = CAKeyframeAnimation(keyPath: keyPath)
        
        //由關鍵幀(關鍵值),通過關鍵幀對應的值執行動畫
        keyFrame.values = values
        
        //當設置了path之后,values就沒有效果了
        keyFrame.path = path
        
        //計算模式
        /*
         `discrete', 離散的,不進行插值運算
         `linear',   線性插值
         `paced',    節奏動畫,自動計算動畫的運動時間,是的動畫均勻運行,而不是根據keyTimes的值進行動畫,設置這個模式keyTimes和timingFunctions無效
         `cubic'      對關鍵幀為坐標點的關鍵幀進行圓滑曲線相連后插值計算,需要設置timingFunctions。還可以通過tensionValues,continueityValues,biasValues來進行調整自定義
         `cubicPaced' 結合了paced和cubic動畫效果
         */
        keyFrame.calculationMode = cacluationMode
        
        //旋轉模式
        /*
         `auto' = kCAAnimationRotateAuto                根據路徑自動旋轉
         `autoReverse' = kCAAnimationRotateAutoReverse  根據路徑自動翻轉
         */
        keyFrame.rotationMode = rotationMode
        
        /*
         用來區分動畫的分割時機。值區間為0.0 ~ 1.0 ,數組中的后一個值比前一個大或者相等,最好的是和Values或者Path控制的值對應
         這個屬性只在 calculationMode = linear/discrete/cubic是被使用
         */
        keyFrame.keyTimes = keyTimes
        
        //動畫時長
        keyFrame.duration = duration
        
        return keyFrame
        
    }



效果:

aniKeyFrame.gif

三、組動畫CAAnimationGroup
組動畫是就是添加多個動畫,同時產生動畫效果
這個的屬性比較簡單:

  • open var animations: [CAAnimation]?

代碼

//創建動畫組
        let layerGroup = CAAnimationGroup()
        
        //添加動畫
        layerGroup.animations = [shadowColorAni,shadowOffsetAni,shadowRadiusAni,shadowOpacityAni,positionYAni,boundsAni]
        
        //重復次數
        layerGroup.repeatCount = Float.infinity
        
        //動畫時間
        layerGroup.duration = 1.8
        
        //翻轉
        layerGroup.autoreverses = true
        
        //把層添加進去
        view.layer.insertSublayer(shapeLayer, at : 0)
        
        //添加動畫
        shapeLayer.add(layerGroup, forKey: "layerGroup")



效果:

aniGroup.gif


四、CATransition轉場動畫

屬性介紹

圖片.png

代碼

class func transitionAnimationWith(duration : CFTimeInterval, type : String , subtype : String? , startProgress : Float , endProgress : Float) -> CATransition{
        let transitionAni = CATransition()
        
        //轉場類型
        transitionAni.type = type
        
        /*
         kCATransitionFromTop       從頂部轉場
         kCATransitionFromBottom    從底部轉場
         kCATransitionFromLeft      從左邊轉場
         kCATransitionFromRight     從右邊轉場
         */
        transitionAni.subtype = subtype ?? kCATransitionFromLeft
        
        //動畫開始的進度
        transitionAni.startProgress = startProgress
        
        //動畫結束的進度
        transitionAni.endProgress = endProgress
        
        //動畫的時間
        transitionAni.duration = duration
        
        return transitionAni
    }



效果

aniTransition.gif

五、IOS9之后的 Spring動畫

屬性:

圖片.png

代碼

class func springAnimationWithPath(_ path : String , mass : CGFloat , stiffness : CGFloat , damping : CGFloat , fromValue : Any? , toValue : Any) -> CASpringAnimation{
        let springAni = CASpringAnimation(keyPath: path)
        
        //質量:影響圖層運動時的彈簧慣性,質量越大,彈簧的拉伸和壓縮的幅度越大,動畫的速度變慢,且波動幅度變大
        springAni.mass = mass
        
        //剛度:越大動畫越快
        springAni.stiffness = stiffness
        
        //阻尼:越大停止越快
        springAni.damping = damping
        
        //初始速率
        springAni.initialVelocity = 0
        
        //初始值
        springAni.fromValue = fromValue
        
        //結束值
        springAni.toValue = toValue
        
        print("動畫停止預估時間" + "\(springAni.settlingDuration)")
        
        springAni.duration = springAni.settlingDuration
        
        return springAni
    }

效果:


aniSpring.gif


六、綜合實例

動畫代碼全部都在Git上面


aniDrawline.gif
aniFire1.gif
aniFire2.gif
aniLogin.gif
aniWaveLine.gif


  • DEMO地址

  • 如果覺得有用,用star砸死我吧

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

推薦閱讀更多精彩內容