国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Swift > 正文

利用Swift實(shí)現(xiàn)各類(lèi)的CATransition動(dòng)畫(huà)詳解

2020-03-09 17:44:29
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

前言

最近因?yàn)楣ぷ鞯男枰蛩阌胹wift/172288.html">swift/238953.html">swift重構(gòu)現(xiàn)有項(xiàng)目,實(shí)現(xiàn)過(guò)程中發(fā)現(xiàn)用到了很多系統(tǒng)的動(dòng)畫(huà)實(shí)現(xiàn),因?yàn)橹暗亩际怯肙C實(shí)現(xiàn)的,這里主要是把一些動(dòng)畫(huà)效果來(lái)通過(guò)swift實(shí)現(xiàn)一下。

這篇文章主要是實(shí)現(xiàn)一下CATransition動(dòng)畫(huà)的不同效果。

第一步 創(chuàng)建一個(gè)swift文件并聲明相應(yīng)的枚舉類(lèi)型

enum TransitionAnimType : Int {case fade = 0,    //淡入淡出push,      //推擠reveal,      //揭開(kāi)moveIn,      //覆蓋cube,      //立方體suckEffect,     //吮吸oglFlip,     //翻轉(zhuǎn)rippleEffect,    //波紋pageCurl,     //翻頁(yè)pageUnCurl,     //反翻頁(yè)cameraIrisHollowOpen,  //開(kāi)鏡頭cameraIrisHollowClose,  //關(guān)鏡頭curlDown,     //下翻頁(yè)curlUp,      //上翻頁(yè)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ī)}

上面三個(gè)枚舉類(lèi)型分別代表:

  • TransitionAnimType:動(dòng)畫(huà)類(lèi)型
  • TransitionSubType:動(dòng)畫(huà)方向
  • TransitionCurve:動(dòng)畫(huà)曲線

第二步 自定義函數(shù)返回動(dòng)畫(huà)類(lèi)型

/// 返回動(dòng)畫(huà)類(lèi)型private func animationType(animType: TransitionAnimType) -> String { /// 設(shè)置轉(zhuǎn)場(chǎng)動(dòng)畫(huà)類(lèi)型 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ù)返回動(dòng)畫(huà)方向

/// 返回動(dòng)畫(huà)方向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ù)返回動(dòng)畫(huà)曲線

/// 返回動(dòng)畫(huà)曲線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),上面三個(gè)自定義方法中我們都用到了objectFromDataSource這個(gè)方法,從我們的傳參不難發(fā)現(xiàn),它就是為了返回我們需要的指定數(shù)據(jù)的,下面我們來(lái)實(shí)現(xiàn)一下這個(gè)方法

/// 統(tǒng)一從數(shù)據(jù)返回對(duì)象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)做好,接下來(lái)我們來(lái)看一下具體的動(dòng)畫(huà)實(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()/// 動(dòng)畫(huà)時(shí)長(zhǎng)transition.duration = CFTimeInterval(duration)/// 動(dòng)畫(huà)類(lèi)型transition.type = animationType(animType: animTye)/// 動(dòng)畫(huà)方向transition.subtype = animationSubType(subType: subType)/// 緩動(dòng)函數(shù)transition.timingFunction = CAMediaTimingFunction(name: animationCurve(curve: curve))/// 完成動(dòng)畫(huà)刪除transition.isRemovedOnCompletion = truelayer.add(transition, forKey: key)}

大功告成!接下來(lái)我們?nèi)バ枰褂脛?dòng)畫(huà)的地方來(lái)調(diào)取我們第六步實(shí)現(xiàn)的方法就好了。so easy !哈哈

layerTransition(animTye: .ramdom, subType: .ramdom, curve: .Ramdom, duration: 2.0, layer: (self.view.window?.layer)!)

是不是感覺(jué)很簡(jiǎn)單呢,上面的代碼組合一下就可以直接用嘍,有需要的拿走不謝~~

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)VEVB武林網(wǎng)的支持。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到swift教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 钦州市| 延津县| 娱乐| 介休市| 星座| 长宁县| 永和县| 绵竹市| 二连浩特市| 紫金县| 万山特区| 大同县| 枣强县| 安平县| 宁明县| 长兴县| 寻甸| 肃南| 丹阳市| 乃东县| 玉屏| 石阡县| 阳城县| 邹平县| 简阳市| 通州区| 沈阳市| 大兴区| 潼关县| 昌图县| 广丰县| 芦溪县| 通化市| 富源县| 沿河| 赤峰市| 静安区| 梅州市| 台安县| 逊克县| 油尖旺区|