所有知识点来自《核心动画编程指南》知识点
一.动画介绍
核心动画类分为:图层类,动画和计时类,布局和约束类,事务类(组合图层类)。
1)图层类
2)动画和计时类
继承于CAAnimation,实现了CAMediaTiming协议,提供了持续时间,速度和重复计数。
也实现了CAAction协议,为图层触发动画提供了标准化响应。
额外的抽象细化的动画类:
CATransition过渡效果。
CAAnimationGroup组合动画。
CAPropertyAnimation支持动画显示图层的关键路径中指定的属性。
CABasicAnimation修改图层属性。
CAKeyframeAnimation 关键帧动画
3)布局和约束类
CAConstraint指定子图层类限制于你指定的约束集合。
4)事务类
CATransaction负责协调多个原子动画更新显示操作。
三.图层的几何和变换
坐标系
在iOS系统中,默认的坐标系统原点在图层的左上角方向,向右和向下为正值。
几何
图层的position是一个CGPoint值,指定的相当于它在父视图的位置,该值基于父图层的坐标系。
图层的bounds属性是一个CGRect值,指定图层的大小和图层的原点。当你重写图层的重画方法时,bounds原点可以作为图形上下文的原点。
bounds.size = frame.size.
锚点anchorPoint是一个CGPoint值,指定了基于图层bounds的符合位置的坐标系的位置。锚点指定了bounds相对于position的值。锚点(0.0,0.0)是图层的原点。
几何变换
CATransform3D定义了一个同质的三维变换,用于图层的旋转,缩放,偏移,歪斜和应用的透视。
transform和sublayerTransform属性指定了变换矩阵。transform指定的矩阵结合图层的anchorPoint作用于图层和图层的子图层上面。sublayerTransform只会影响图层的子图层,不会对图层本身产生影响。
可以通过几个方法改变CATransform3D的数据结构:使用CATransform3D函数,直接修改数据结构的成员,使用键值编码改变键路径。
变换函数
CATransform3DMakeTranslation,CATransform3DTranslate,CATransform3DMakeScale,CATransform3DMakeRotation,CATransform3DRotate。
旋转的单位采用的是弧度(radians),而不是角度,可以互相切换。DegreesToRadians和RadiansToDegress。
反向转换矩阵CATransform3DInvert。用反转点内转化对象提供反向转换。反转矩阵乘以逆矩阵值,结果是原值,可以用来回复已经被变换了的矩阵。
方法:CATransform3DMakeAffineTransform,CATransform3DIsAffine,CATransform3DGetAffineTransform。
同时有方法来比较变换矩阵是否是单位矩阵,或者两个矩阵是否相等:CATranform3DIsIdentity,CATranform3DEqualToTransform.
修改变换的数据结构
struct CATransform3D
{
CGFloat m11, m12, m13, m14;
CGFloat m21, m22, m23, m24;
CGFloat m31, m32, m33, m34;
};
typedef struct CATransform3D CATransform3D;
配置
CATransform3D aTransform = CATransform3DIdentity;
// the value of zDistance affects the sharpness of the transform.
zDistance = 850;
aTransform.m34 = 1.0/-zDistance;
通过键值路径修改变换
不能用常规的myLayer.transform.rotation.x = 0;
需要通过setValue:forKeyPath:或者valueForKeyPath:方法:
[myLayer setValue:【NSNumber numberWithInt:0】 forKeyPath:@"transform.rotation.x"];
四.图层树的层次结构
什么是图层结构
拥有父图层suplayer和子图层sublayer。图层树好处:
1.复杂的接口可以由简单的图层来组合。图层非常适合于这种堆叠方式来合成复杂的功能。
2.每个图层定义了一个基于其父图层的坐标系的坐标系。当一个图层变换的时候,它的子图层同样变换。
3.一个动态的图层树,可以再程序运行的时候重新设置。图层可以创建并添加为一个图层的第一个子图层,然后从其他图层的图层树上面删除。
在视图里面显示图层
核心动画通过视图来显示图层。iOS的视图系统是在图层上的,每个UIView都自动创建一个CALayer类的实例,然后把该实例赋值给layer属性。可以在需要的时候向视图的图层里面添加子图层。
从图层结构里面添加和删除图层
addSublayer:,insertSublayer:atIndex:,insertSublayer:below:,insertSublayer:above:,removeFormSuperlayer,replaceSublayer:with:。
可以通过使用一个图层的数组来设置图层的子图层,甚至可以扩展设置父图层的sublayers属性。当把图层的sublayers属性设置了一个图层的数组值的时候,你必须保证数组里面每个图层的父图层已经被设置为 nil。
图层的位置调整和大小改变
frame、bounds、position、anchorPoint和zPosition来编程式移动和改变图层大小。
如果一个图层的属性needsDisplayOnBoundsChange被设置为 YES 的时候,当图层的bounds属性改变的时候,图层的内容将会被重新缓存起来。默认情况下图层的needsDisplayOnBoundsChange属性值为 NO。
自动调整图层大小
CALayer供了一个机制,在父图层被移动或者改变大小的时候,子图层可以自动的跟着移动和调整大小。在很多情况下简单的配置一个图层的自动调整掩码(autoresizing mask)可以适当的适应程序的行为。一个图层的自动调整掩码可以通过指定CAAutoresizingMask的常量结合或运算(OR)所得的结果赋值给图层的autoresizingMask属性值。
CALayer的 子 类 可 以 重 写 函 数resizeSublayersWithOldSize: 和resizeWithOldSuperlayerSize:来定制化的自动调整图层大小的行为。图层的函数resizeSublayersWithOldSize:将会在bounds属性被修改的时候自动的触发执行,同时发送一个消息resizeWithOldSuperlayerSize:给图层的每个子图层。图层的每个子图层根据自动调整掩码的属性来比较就的边界值和新的边界值来调整它的位置和大小。
裁剪子图层
当子视图超出父视图的边界的时候,视图将会被裁剪以适应父视图的大小。图层去掉了这个限制,允许子层全部显示,无论自己相对于父层位置如何。图层的masksToBounds属性决定了是否子图层是否相对父图层裁剪。该属性masksToBounds的默认值为 NO,即防止子图层被相对于父图层裁剪。