利用Swift實現各類的CATransition動畫詳解

分類:IT技術 時間:2017-09-27

前言

最近因為工作的需要,打算用swift重構現有項目,實現過程中發現用到了很多系統的動畫實現,因為之前的都是用OC實現的,這裏主要是把一些動畫效果來通過swift實現一下。

這篇文章主要是實現一下CATransition動畫的不同效果。

第一步 創建一個swift文件並聲明相應的枚舉類型

enum TransitionAnimType : Int {
case fade = 0,    //淡入淡出
push,      //推擠
reveal,      //揭開
moveIn,      //覆蓋
cube,      //立方體
suckEffect,     //吮吸
oglFlip,     //翻轉
rippleEffect,    //波紋
pageCurl,     //翻頁
pageUnCurl,     //反翻頁
cameraIrisHollowOpen,  //開鏡頭
cameraIrisHollowClose,  //關鏡頭
curlDown,     //下翻頁
curlUp,      //上翻頁
flipFromLeft,    //左翻轉
flipFromRight,    //右翻轉
ramdom      //隨機
}

enum TransitionSubType : Int {
case top = 0,    //上
left,      //左
bottom,      //下
right,      //右
ramdom      //隨機
}

enum TransitionCurve : Int {
case Default = 0,   //默認
EaseIn,      //緩進
EaseOut,     //緩出
EaseInEaseOut,    //緩進緩出
Linear,      //線性
Ramdom      //隨機
}

上面三個枚舉類型分別代表:

    TransitionAnimType:動畫類型 TransitionSubType:動畫方向 TransitionCurve:動畫曲線

第二步 自定義函數返回動畫類型

/// 返回動畫類型
private func animationType(animType: TransitionAnimType) -> String {
 /// 設置轉場動畫類型
 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
}

第三步 自定義函數返回動畫方向

/// 返回動畫方向
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
}

第四步 自定義函數返回動畫曲線

/// 返回動畫曲線
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
}

第五步 不難發現,上面三個自定義方法中我們都用到了objectFromDataSource這個方法,從我們的傳參不難發現,它就是為了返回我們需要的指定數據的,下面我們來實現一下這個方法

/// 統一從數據返回對象
private func objectFromDataSource(array: Array<Any>, index: Int, isRamdom: Bool) -> AnyObject {
 let count = array.count
 let i = isRamdom "jb51code">
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)

/// 緩動函數
transition.timingFunction = CAMediaTimingFunction(name: animationCurve(curve: curve))

/// 完成動畫刪除
transition.isRemovedOnCompletion = true

layer.add(transition, forKey: key)

}

大功告成!接下來我們去需要使用動畫的地方來調取我們第六步實現的方法就好了。so easy !哈哈

layerTransition(animTye: .ramdom, subType: .ramdom, curve: .Ramdom, duration: 2.0, layer: (self.view.window"color: #ff0000">總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對電腦玩物的支持。


Tags: 動畫 實現 類型 緩進 翻轉 TransitionAnimType

文章來源:


ads
ads

相關文章
ads

相關文章

ad