核心动画
1、CALayer(iOS的所有view都是画出来的)
1>UIView之所以有显示功能,是因为它内部有一个图层,这个默认的layer就是view的RootLayer
当UIView需要显示到屏幕上时,就会调用drawRect方法在自己图层上进行绘图,绘图完毕后,系统会将图层拷贝到屏幕上,于是完成UIView的显示
2>给layer添加图片和背景色
a.修改QuartzCore不能使用UIImage,UIColor(属于UIKit框架的东西,只能使用在iOS中)只能使用CGImageRef和CGColorRef(属于CoreGraphis框架通用在iOS和mac os x上)
b.给layer添加图片是添加在layer.contents上的,contents必须是CGImageRef先赚CGImageRef再转成id
3>UIKit框架转化成CoreGraphics
直接.CG开头eg:[UIColor redColor].CGColor;
4>CoreGraphics转成UIKit
layer.contents = (__bridge id)(image.CGImage);
5>设置阴影
shadowOpacity:阴影的不透明度
6>系统对核心动画中的KVC做了包装,可以做快速的二维旋转(不推荐使用)
7>position和anchorPoint
a.position:描述位置,
b.anchorPoint:锚点,取值范围在0~1,默认是(0.5,0.5);锚点是默认的旋转点,是position在layer坐标系上的位置体现,可以认为是将position转成layer坐标系的点的比例尺
c.锚点位置确定
将layer的w和h分别乘以锚点的x和y,会得到一个layer上的点,这个点应该和position所指的点重合
3、隐式动画
1>默认UIView都有一个layer,这个默认的layer就是view的RootLayer(跟层)。非根层(自定义的)才会有隐式动画
2>取消隐式动画
所有的动画都会包装成一个事物CATransaction,隐式动画同样被系统封装成一个CATransaction,而且对非根层,系统默认会为隐式动画这个事物CATransaction,不需要我们手动开启该事物,可以直接操作隐式动画的开启和取消[CATransaction setDisableActions:YES];
3>可动画属性(Animation Properties)
a.当对这些非根层的部分属性进行修改时候就会产生隐式动画,这些属性称为可动画属性
b.常见的可动画属性
bounds
background
position
5、核心动画(对于不熟悉的类可以直接用类名及或父类名尝试快速创建对象)
1>CAAnimation的通用属性
a.duration:动画的持续时间
b.repeatCount:动画的重复次数
c.timingFunction:控制动画的节奏
timingFunction可选值:
- kCAMediaTimingFunctionLinear(线性):匀速,给你一个相对静态的感觉
- kCAMediaTimingFunctionEaseIn(渐进):动画缓慢进入,然后加速离开
- kCAMediaTimingFunctionEaseOut(渐出):动画全速进入,然后减速的到达目的地
- kCAMediaTimingFunctionEaseInEaseOut(渐进渐出):动画缓慢的进入,中间加速,然后减速的到达目的地。这个是默认的动画行为。
d.delegate:动画代理,用来监听动画的执行过程,代理方法被定义在CAAnimationDelegate分类当中
animationDidStart:(CAAnimation *)anim;//动画开始的时候触发
animationDidStop:(CAAnimation *)anim finished:(BOOL)flag;//动画执行完毕触发
2>CAAnimation的继承结构
a.组动画就是CAAnimationGroup
b.专场动画就是CATransition
c.CAPropertyAnimation是一个抽象类,本身不能实现动画,有两个子类是CABasicesAnimation和CAKeyAnimation可以实现动画
3>CABasicAnimation(基本动画)
a.创建基本动画对象CABasicAnimation *anima = [CABasicAnimation animation];
b.设置动画要修改的layer属性keypath anima.keyPath = @“position”;(这里是系统封装的KVC可以去查表)
c.设置动画要修改的属性的值anima.toValue或者fromValue, byValue
d.添加动画对象到图层
4>CAKeyAnimation(关键帧动画,通常是需要多个值之间做动画,顺着values数组,通常数组当中是一组点,描述路劲)
a.创建关键帧动画的对象CAKeyAnimation *anima = [CAKeyAnimation animation];
b.填充帧动画数组anima.values(可以是几个点)
c.如果设置了关键帧动画的anima.path那么values将被忽略。path可以设置CGPathRef,CGMutablePathRef,让图层按照路径轨迹移动,path只对anchorPoint和position起作用
d.如果有必要设置anima.keyTimes,给每一个values当中的对象设置时间,如果没有设置时间平分
e.添加动画对象到图层
5>CATransitionAnimation(转场动画)
a.创建转场动画的对象CATransition *anima = [CATransiton animation];
b.设置转场动画的类型anima.type 查表即可
c.如果转场动画需要方向设置anima.subType (属于c语言枚举类型k开头的宏定义)
d.如果有必要设置转场动画的开始和结束进度anima.startProgress或者endProgress(取值在0~1之间)
e.添加转场动画到图层
注意:转场动画必须和过度代码放在一起,否则没有效果
6>CAAnimationGroup(组动画,批量同时执行动画)
a.创建组动画对象CAAnimationGroup *anima = [CAAnimationGroup animation];
b.创建组动画需要组合的动画对象,并装入组动画数组anima.animations = (动画对象数组)
c.默认的组动画是同时进行的,也可设置beginTime属性来设置每个动画的开启时间
c.添加组动画到图层
7>CADisplayLink
1>CADisplayLink是一种以屏幕刷新频率触发的时钟机制,屏幕的刷新频率大概60Hz,所以该机制大概1秒刷新60次左右
2>CADisplayLink是一个计时器,可以使绘图代码与试图的刷新平率保持同步,相比而言NSTimer无法确保计时器实际触发的准确时间
3>使用方法
a.定义CADisplayLink并制定触发调用方法
b.将显示链接加到主运行循环队列
- (CADisplayLink *)link
{
if (_link == nil) {
// 屏幕刷新的时候就会触发,1秒刷新60
_link = [CADisplayLink displayLinkWithTarget:self selector:@selector(updateTime)];
[_link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
}
return _link;
}
8>UIView动画和核心动画的选择
a.因为核心动画是作用在CAlaye上,直接继承自NSObject,不能接受事件,而UIView继承自UIResponder是可以接受事件,所以当需要与用户交互的时候,就必须使用UIView
9、取消反弹(因为核心动画只是假象不能改变控件的真实属性,所有的假象会在核心动画结束后复位到原位,表现出来的就是反弹)
anim.removedOnCompletion = NO;
anim.fillMode = kCAFillModeForwards;
10、注意
a.核心动画只是一个假象,不会改变layer的属性,只是看起来很炫,如果要想改变属性只能使用UIView封装的动画
b.核心动画是在后台执行的,不会阻塞主线程,而且直接作用在CALayer上,并非UIView,UIView有自己的封装动画,所以会看到反弹会原始位置
11、附录
1>转场动画
2>transform属性列表