利用Swift实现各类的CATransition动画详解
时间:2019-04-06
本文章向大家介绍利用Swift实现各类的CATransition动画详解,主要包括利用Swift实现各类的CATransition动画详解使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
前言
最近因为工作的需要,打算用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 ? Int(arc4random_uniform(UInt32(count))) : index return array[i] as AnyObject }
第六步 好了,现在所有的准备工作已经做好,接下来我们来看一下具体的动画实现的方法
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?.layer)!)
是不是感觉很简单呢,上面的代码组合一下就可以直接用喽,有需要的拿走不谢~~
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。
- python接口自动化12-案例分析(csrfToken)
- Python基础学习笔记
- POJ 3278 Catch That Cow(BFS,板子题)
- 【请您听我说】PHP语法特点的一些看法
- 喵哈哈村的魔法考试 Round #1 (Div.2) 题解&源码(A.水+暴力,B.dp+栈)
- 查找第k小的元素(O(n)递归解法)
- C/C++对bool operator < (const p &a)const的认识,运算符重载详解(杂谈)
- C/C++中substr函数的应用(简单讲解)
- C++ STL学习之容器set和multiset (补充材料)
- Codeforces Round #410 (Div. 2)(A,字符串,水坑,B,暴力枚举,C,思维题,D,区间贪心)
- 关于int *a[常量]与int (*a)[常量]的分析与区分(详解)
- python笔记3-发送邮件(smtplib)
- 关关的刷题日记01—Leetcode 169. Majority Element
- 关小刷刷题02——Leetcode 169. Majority Element 方法2和3
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 手把手教学,如何解决 Git 冲突?
- spring的spi
- spring整合ORM框架
- spring的缓存(cache)-本地
- spring的缓存(cache)-分布式缓存
- spring的缓存(cache)-(缓存穿透、缓存击穿、缓存雪崩、热点数据)
- spring-配置文件外化
- 腾讯地图获取全国行政区划检索列表Demo
- iOS开发~UIView layer 之前的关系
- iOS进阶_KVC(&KVC赋值取值过程分析&KVC自定义&异常处理)
- python 学习笔记(8)——python绝对路径相对路径
- 设计模式-访问者模式
- 设计模式-空对象模式
- 设计模式-观察者模式
- Selenium自动化最佳实践技巧(上)