iOSiOS动画及开源库iOS Developer

CoreAnimation(核心动画)概述

2017-01-17  本文已影响635人  苦工

demo 地址

内容

1. CoreGraphics,QuartzCore, CoreAnimation区别

对CoreGraphics,QuartzCore, CoreAnimation 这三个概念傻傻分不清,先梳理一下

CoreGraphics(核心图形)

它是iOS的核心图形库,包含Quartz2D绘图API接口,常用的是point,size,rect等这些图形,都定义在这个框架中,类名以CG开头的都属于CoreGraphics框架,它提供的都是C语言函数接口,是可以在iOS和mac OS 通用的

QuartzCore

Quartz是位于Mac OS X的Drawin核心之上的绘图层,这个框架感觉不是很清晰,但是看头文件可以发现,它就是CoreAnimation,这个框架头文件只包含了CoreAnimation.h

CoreAnimation(核心动画)


框架关系

image

2.CoreAnimation结构及图层动画 官方文档

核心动画类结构

image

2.1 关于图层

CALayer基本属性
@property CGRect bounds; //宽度和高度
@property CGPoint position; //位置(默认指中点,具体由anchorPoint决定)
@property CGPoint anchorPoint; // 锚点(x,y的范围都是0-1),决定了position的位置
@property CGColorRef backgroundColor; // 背景颜色(CGColorRef类型)
@property CATransform3D transform; //形变属性

可动画属性特点:

* 直接对它付值可产生隐士动画
* CAAnimation的keyPath可以设置为这个属性的名字

对这些属性赋值的时候,layer会让它的delegate调用actionForLayer:forKey:方法获取一个返回值,这个返回值可能是这样几种情况:
1、是一个nil,则layer会走自己的隐式动画;
2、是一个NSNull,则layer不会做任何动画;
3、是一个实现了CAAction协议的对象,则layer会用这个对象生成一个CABasicAnimation加到自己身上执行动画


CALayer与UIView的关系
总结:CALayer作为一个跨平台框架(OS X和iOS)QuatzCore的类,iOS系统
为了处理用户交互事件(触屏操作)用UIView封装了一次CALayer,UIView本
身负责处理交互事件,其持有一个Layer,用来负责绘制这个View的内容。而
我们对UIView的和绘制相关的属性赋值和访问的时候(frame、
backgroundColor等)UIView实际上是直接调用其Layer对应的属性(frame对
应frame,center对应position等)的getter和setter。
核心动画渲染框架
image
图层几何属性(mac os 下坐标系)

<img src="http:https://img.haomeiwen.com/i2591298/9a0f634f7aacbe29.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240">

图层的 frame、bounds、position 和 anchorPoint 关系如下图所示

<img src="http:https://img.haomeiwen.com/i2591298/5d46d0fa25fde111.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240">

anchorPoint 默认值为(0.5,0.5),位于图层的中心点。图层的 position 值为(100.0,100.0),bounds 为(0.0,0.0,120,80.0)。通过计算得到图层的 frame为(40.0,60.0,120.0,80.0)

几种常用的Layer

2.2 关于动画

UIViewAnimation动画

iOS开发中,UIKit为我们封装好的核心动画层的方法,通过这些方法,基本能达到我们项目的大多需求,其中UIView动画使用简便,开发中应用十分广泛

  1. 使用begin和commit方式
例如:
  UIView * view = [[UIView alloc]initWithFrame:CGRectMake(100, 100, 100, 100)];
  [self.view addSubview:view];
  view.backgroundColor=[UIColor redColor];
  [UIView beginAnimations:@"test" context:nil];
  [UIView setAnimationDuration:3];
  view.backgroundColor=[UIColor orangeColor];
  [UIView commitAnimations];//执行commit后,动画即开始执行  
  
  ``` 
 
 2. 使用block块api
 

例如:
[UIView animateWithDuration:1 animations:^{
_myView.alpha=0;
} completion:^(BOOL finished) {
if (finished) {
_myView.alpha=1;
}
}];
```
支持动画的属性

image
CAAnimation

如果你想更加自由的通过动画操作视图的属性,你就需要跳过UIKit的封装,使用CoreAnimation核心动画层的方法来实现动画,CoreAnimation能够实现更多复杂、好看、高效的动画效果

* 阴影,圆角,带颜色的边框。
* 3D变化。
* 透明遮罩
* 多级非线性动画

CAAnimation是CoreAnimation框架中执行动画的基类,是个抽象类,不具备动画效果,必须用它的子类才有动画效果,是所有动画对象的父类,负责控制动画的持续时间和速度

CAAnimation相关的几个动画类的关系图


image
CAPropertyAnimation

是CAAnimation的子类,也是个抽象类,要想创建动画对象,应该使用它的两个子类:CABasicAnimation和CAKeyframeAnimation

通过指定CALayer的一个属性名称为keyPath(NSString类型),并且对CALayer的这个属性的值进行修改,达到相应的动画效果

CABasicAnimation

基本动画,通过设定起始点,终点,时间,动画会沿着你这设定点进行移动,
随着动画的进行,在长度为duration的持续时间内,keyPath相应属性的值从fromValue渐渐地变为toValue。

CAKeyframeAnimation

主要操作属性有keyPath和values值组合,以通过设定CALayer的始点、中间关键点、终点的frame,时间,动画会沿你设定的轨迹进行移动
与CABasicAnimation的区别是:

CAAnimationGroup

可以保存一组动画对象,将CAAnimationGroup对象加入层后,组中所有动画对象可以同时并发运行

CATransition

用于做转场动画,能够为层提供移出屏幕和移入屏幕的动画效果。iOS比Mac OS X的转场动画效果少一点。

UINavigationController就是通过CATransition实现了将控制器的视图推入屏幕的动画效果。

使用CoreAnimation做动画的时候,遵循四步就好
1.创建CAAnmation子对象
2.设置CAAnmation的属性
3.调用CALayer的addAnimation:forKey将CAAnimation对象添加到CALayer上,就能执行动画
4.调用CALayer的removeAnimationForKey方法可以停止CALayer中的动画

遗留问题

  1. 隐式动画,显式动画和隐式事务,显示事务混淆
  2. 没有用到CATransaction begin,commit 依然有动画效果

概念补充

显式动画&隐式动画
CATransaction 事务

CATransaction 是核心动画里负责协调多个动画更新显示操作,保证多个动画同时进行,用于配置隐式动画,即CALayer属性修改依赖CATransaction.

和动画类似CATransaction也分为隐式事务和显式事务

隐式事务:在某次RunLoop中设置了一个“Animatable”属性,如果当前没有设置事务,则会自动创建一个CATransaction,并在当前线程的下一个RunLoop中commit这个CATransaction

显式事务:直接调用CATransaction的[CATransaction begin],[CATransaction commit]等相关方法

另外事务可以嵌套,当事务嵌套时候,只有最外层的事务commit了之后,整个动画才会执行。

参考资料

几种常用Layer的使用解析

贝塞尔曲线原理(简单阐述)

上一篇 下一篇

猜你喜欢

热点阅读