核心动画

核心动画详解

核心动画

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属性列表


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值