利用Swift實(shí)現(xiàn)各類的CATransition動畫詳解
前言
最近因?yàn)楣ぷ鞯男枰?,打算用swift重構(gòu)現(xiàn)有項(xiàng)目,實(shí)現(xiàn)過程中發(fā)現(xiàn)用到了很多系統(tǒng)的動畫實(shí)現(xiàn),因?yàn)橹暗亩际怯肙C實(shí)現(xiàn)的,這里主要是把一些動畫效果來通過swift實(shí)現(xiàn)一下。
這篇文章主要是實(shí)現(xiàn)一下CATransition動畫的不同效果。
第一步 創(chuàng)建一個swift文件并聲明相應(yīng)的枚舉類型
enum TransitionAnimType : Int { case fade = 0, //淡入淡出 push, //推擠 reveal, //揭開 moveIn, //覆蓋 cube, //立方體 suckEffect, //吮吸 oglFlip, //翻轉(zhuǎn) rippleEffect, //波紋 pageCurl, //翻頁 pageUnCurl, //反翻頁 cameraIrisHollowOpen, //開鏡頭 cameraIrisHollowClose, //關(guān)鏡頭 curlDown, //下翻頁 curlUp, //上翻頁 flipFromLeft, //左翻轉(zhuǎn) flipFromRight, //右翻轉(zhuǎn) ramdom //隨機(jī) } enum TransitionSubType : Int { case top = 0, //上 left, //左 bottom, //下 right, //右 ramdom //隨機(jī) } enum TransitionCurve : Int { case Default = 0, //默認(rèn) EaseIn, //緩進(jìn) EaseOut, //緩出 EaseInEaseOut, //緩進(jìn)緩出 Linear, //線性 Ramdom //隨機(jī) }
上面三個枚舉類型分別代表:
- TransitionAnimType:動畫類型
- TransitionSubType:動畫方向
- TransitionCurve:動畫曲線
第二步 自定義函數(shù)返回動畫類型
/// 返回動畫類型 private func animationType(animType: TransitionAnimType) -> String { /// 設(shè)置轉(zhuǎn)場動畫類型 let animTypeArray = ["fade", "push", "reveal", "moveIn", "cube", "suckEffect", "oglFlip", "rippleEffect", "pageCurl", "pageUnCurl", "cameraIrisHollowOpen", "cameraIrisHollowClose", "curlDown", "curlUp", "flipFromLeft", "flipFromRight", "ramdom"] return objectFromDataSource(array: animTypeArray, index: animType.rawValue, isRamdom: (TransitionAnimType.ramdom == animType)) as! String }
第三步 自定義函數(shù)返回動畫方向
/// 返回動畫方向 private func animationSubType(subType: TransitionSubType) -> String { let animSubTypeArray = [kCATransitionFromTop, kCATransitionFromLeft, kCATransitionFromBottom, kCATransitionFromRight] return objectFromDataSource(array: animSubTypeArray, index: subType.rawValue, isRamdom: (TransitionSubType.ramdom == subType)) as! String }
第四步 自定義函數(shù)返回動畫曲線
/// 返回動畫曲線 private func animationCurve(curve: TransitionCurve) -> String { let animCurveArray = [kCAMediaTimingFunctionDefault, kCAMediaTimingFunctionEaseIn, kCAMediaTimingFunctionEaseOut, kCAMediaTimingFunctionEaseInEaseOut, kCAMediaTimingFunctionLinear] return objectFromDataSource(array: animCurveArray, index: curve.rawValue, isRamdom: (TransitionCurve.Ramdom == curve)) as! String }
第五步 不難發(fā)現(xiàn),上面三個自定義方法中我們都用到了objectFromDataSource這個方法,從我們的傳參不難發(fā)現(xiàn),它就是為了返回我們需要的指定數(shù)據(jù)的,下面我們來實(shí)現(xiàn)一下這個方法
/// 統(tǒng)一從數(shù)據(jù)返回對象 private func objectFromDataSource(array: Array<Any>, index: Int, isRamdom: Bool) -> AnyObject { let count = array.count let i = isRamdom ? Int(arc4random_uniform(UInt32(count))) : index return array[i] as AnyObject }
第六步 好了,現(xiàn)在所有的準(zhǔn)備工作已經(jīng)做好,接下來我們來看一下具體的動畫實(shí)現(xiàn)的方法
func layerTransition(animTye: TransitionAnimType, subType: TransitionSubType, curve: TransitionCurve, duration: CGFloat, layer: CALayer) { let key = "transition" if layer.animation(forKey: key) != nil { layer.removeAnimation(forKey: key) } let transition = CATransition() /// 動畫時長 transition.duration = CFTimeInterval(duration) /// 動畫類型 transition.type = animationType(animType: animTye) /// 動畫方向 transition.subtype = animationSubType(subType: subType) /// 緩動函數(shù) transition.timingFunction = CAMediaTimingFunction(name: animationCurve(curve: curve)) /// 完成動畫刪除 transition.isRemovedOnCompletion = true layer.add(transition, forKey: key) }
大功告成!接下來我們?nèi)バ枰褂脛赢嫷牡胤絹碚{(diào)取我們第六步實(shí)現(xiàn)的方法就好了。so easy !哈哈
layerTransition(animTye: .ramdom, subType: .ramdom, curve: .Ramdom, duration: 2.0, layer: (self.view.window?.layer)!)
是不是感覺很簡單呢,上面的代碼組合一下就可以直接用嘍,有需要的拿走不謝~~
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
Swift 使用 Observe 監(jiān)測頁面滾動的實(shí)現(xiàn)方法
這篇文章主要介紹了Swift 使用 Observe 監(jiān)測頁面滾動的實(shí)現(xiàn)方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-05-05Swift?Sequence?Collection使用示例學(xué)習(xí)
這篇文章主要為大家介紹了Swift?Sequence?Collection使用示例學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07Swift如何調(diào)用Objective-C的可變參數(shù)函數(shù)詳解
這篇文章主要給大家介紹了關(guān)于Swift如何調(diào)用Objective-C的可變參數(shù)函數(shù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用swift具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-03-03Swift學(xué)習(xí)教程之SQLite的基礎(chǔ)使用
這篇文章主要給大家介紹了關(guān)于Swift學(xué)習(xí)教程之SQLite的基礎(chǔ)使用,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Swift SQLite具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04