本篇预备知识
- 这一系列是讲iOS开发中动画的使用,所以得基本熟悉iOS开发.
- 代码都是基于swift的,所以也得了解swift啊.
- 这一篇是在前一篇的基础上写的,所以得知道Layer Animations的基本使用吧!
概述
上一篇iOS动画指南 – 2.Layer Animations的基本使用中介绍了Layer Animations的一些基本使用,这一篇我们通过几个小的例子深入了解Layer Animations的用法,所以相比上篇,这篇无论是从篇幅还是连贯性都会有点大,大家准备上车吧.
文章大纲
- 可以在多个值之间变幻的CAKeyframeAnimation.
- 可以画出各种形状的CAShapeLayer.
- 可以给文字添加效果的CAGradientLayer.
- 有轨迹的下拉刷新.
- 可以无限复制的CAReplicatorLayer.
1. CAKeyframeAnimation
开发中情况多种多样,从一个值到另一个值的fromValue和toValue属性并不能高效的满足开发需要,比如我们要将一个view一次经过三个点呢?难道分为两次去做,那太麻烦了.对的,可以用CAKeyframeAnimation去实现,CAKeyframeAnimation有个属性values是个数组完美替代了fromValue,toValue,我们可以把三个点放进values数组,解决问题.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
let flight = CAKeyframeAnimation(keyPath: "position") flight.duration = 2.0 // 无限重复 flight.repeatCount = MAXFLOAT // 注意:不能将CGPoint直接赋值给values需要转换,数组中的元素可以使结构体 // .map { NSValue(CGPoint: $0)}可以将数组中的每一个CGPoint转化为NSValue flight.values = [ CGPoint(x: 50.0, y: 100.0), CGPoint(x: view.frame.width-50, y: 160), CGPoint(x: 50.0, y: view.center.y), CGPoint(x: 50.0, y: 100.0) ].map { NSValue(CGPoint: $0)} // 等价于上面代码 // flight.values = [ // NSValue(CGPoint: CGPoint(x: 50.0, y: 100.0)), // NSValue(CGPoint: CGPoint(x: view.frame.width-50, y: 160)), // NSValue(CGPoint: CGPoint(x: 50.0, y: view.center.y)), // NSValue(CGPoint: CGPoint(x: 50.0, y: 100.0)), // ] flight.keyTimes = [0.0, 0.33, 0.66, 1.0] dogImageView.layer.addAnimation(flight, forKey: nil) |
或者我们可以做一下view的左右晃动,不添加在上面位移基础上,单独去实现:
1 2 3 4 5 6 7 8 |
let wobble = CAKeyframeAnimation(keyPath: "transform.rotation") wobble.duration = 2.5 wobble.repeatCount = MAXFLOAT // 会依次遍历数组中每一个值 wobble.values = [0.0, -M_PI_4/4, 0.0, M_PI_4/4, 0.0] // 为values中的值设置时间,keyTimes按照百分比来的,[0,1]之间 wobble.keyTimes = [0.0, 0.25, 0.5, 0.75, 1.0] dogImageView.layer.addAnimation(wobble, forKey: nil) |
2. CAShapeLayer
使用CAShapeLayer可以绘制各种图形.
比如用来画圆:
1 2 3 4 5 6 7 8 9 |
let circleLayer = CAShapeLayer() let maskLayer = CAShapeLayer() circleLayer.path = UIBezierPath(ovalInRect: dogImageView.bounds).CGPath circleLayer.fillColor = UIColor.clearColor().CGColor maskLayer.path = circleLayer.path // 超出maskLayer部分裁剪掉 dogImageView.layer.mask = maskLayer dogImageView.layer.addSublayer(circleLayer) |
接下来让我们来看下:
由于git图片是循环播放的,所以很难分辨动画的开始和结束,动画的开始其实是这样的:
这是AvatarView的层级:
- photoLayer : 是用来放置图片的.
- circleLayer: 是用来绘制圆形的.
- maskLayer: 是用来裁剪图片的.
- label: 用于设置名字.
让我们来分析下步骤:
- 设置两张图片的圆角
- 两张图片向中间移动,完成后将图片变成方角
- 在两张图片在中间的时候,将两张图片做一个椭圆的碰撞效果
- 后退,图片返回到开始的位置,完成后执行步骤1
实现:
我们对控件做了封装,具体看源码.
1 . 在AvatarView中的didMoveToWindow方法中将新建好的几个属性添加进去
本篇预备知识
- 这一系列是讲iOS开发中动画的使用,所以得基本熟悉iOS开发.
- 代码都是基于swift的,所以也得了解swift啊.
- 这一篇是在前一篇的基础上写的,所以得知道Layer Animations的基本使用吧!
概述
上一篇iOS动画指南 – 2.Layer Animations的基本使用中介绍了Layer Animations的一些基本使用,这一篇我们通过几个小的例子深入了解Layer Animations的用法,所以相比上篇,这篇无论是从篇幅还是连贯性都会有点大,大家准备上车吧.
文章大纲
- 可以在多个值之间变幻的CAKeyframeAnimation.
- 可以画出各种形状的CAShapeLayer.
- 可以给文字添加效果的CAGradientLayer.
- 有轨迹的下拉刷新.
- 可以无限复制的CAReplicatorLayer.
1. CAKeyframeAnimation
开发中情况多种多样,从一个值到另一个值的fromValue和toValue属性并不能高效的满足开发需要,比如我们要将一个view一次经过三个点呢?难道分为两次去做,那太麻烦了.对的,可以用CAKeyframeAnimation去实现,CAKeyframeAnimation有个属性values是个数组完美替代了fromValue,toValue,我们可以把三个点放进values数组,解决问题.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
let flight = CAKeyframeAnimation(keyPath: "position") flight.duration = 2.0 // 无限重复 flight.repeatCount = MAXFLOAT // 注意:不能将CGPoint直接赋值给values需要转换,数组中的元素可以使结构体 // .map { NSValue(CGPoint: $0)}可以将数组中的每一个CGPoint转化为NSValue flight.values = [ CGPoint(x: 50.0, y: 100.0), CGPoint(x: view.frame.width-50, y: 160), CGPoint(x: 50.0, y: view.center.y), CGPoint(x: 50.0, y: 100.0) ].map { NSValue(CGPoint: $0)} // 等价于上面代码 // flight.values = [ // NSValue(CGPoint: CGPoint(x: 50.0, y: 100.0)), // NSValue(CGPoint: CGPoint(x: view.frame.width-50, y: 160)), // NSValue(CGPoint: CGPoint(x: 50.0, y: view.center.y)), // NSValue(CGPoint: CGPoint(x: 50.0, y: 100.0)), // ] flight.keyTimes = [0.0, 0.33, 0.66, 1.0] dogImageView.layer.addAnimation(flight, forKey: nil) |
或者我们可以做一下view的左右晃动,不添加在上面位移基础上,单独去实现:
1 2 3 4 5 6 7 8 |
let wobble = CAKeyframeAnimation(keyPath: "transform.rotation") wobble.duration = 2.5 wobble.repeatCount = MAXFLOAT // 会依次遍历数组中每一个值 wobble.values = [0.0, -M_PI_4/4, 0.0, M_PI_4/4, 0.0] // 为values中的值设置时间,keyTimes按照百分比来的,[0,1]之间 wobble.keyTimes = [0.0, 0.25, 0.5, 0.75, 1.0] dogImageView.layer.addAnimation(wobble, forKey: nil) |
2. CAShapeLayer
使用CAShapeLayer可以绘制各种图形.
比如用来画圆:
1 2 3 4 5 6 7 8 9 |
let circleLayer = CAShapeLayer() let maskLayer = CAShapeLayer() circleLayer.path = UIBezierPath(ovalInRect: dogImageView.bounds).CGPath circleLayer.fillColor = UIColor.clearColor().CGColor maskLayer.path = circleLayer.path // 超出maskLayer部分裁剪掉 dogImageView.layer.mask = maskLayer dogImageView.layer.addSublayer(circleLayer) |
接下来让我们来看下:
由于git图片是循环播放的,所以很难分辨动画的开始和结束,动画的开始其实是这样的:
这是AvatarView的层级:
- photoLayer : 是用来放置图片的.
- circleLayer: 是用来绘制圆形的.
- maskLayer: 是用来裁剪图片的.
- label: 用于设置名字.
让我们来分析下步骤:
- 设置两张图片的圆角
- 两张图片向中间移动,完成后将图片变成方角
- 在两张图片在中间的时候,将两张图片做一个椭圆的碰撞效果
- 后退,图片返回到开始的位置,完成后执行步骤1
实现:
我们对控件做了封装,具体看源码.
1 . 在AvatarView中的didMoveToWindow方法中将新建好的几个属性添加进去