隐式动画的理解:
1,layer层的动画都伴随着一个隐式动画(默认0.25秒的动画,例子:通过layer 层更改一个layer的背景色,可以发现不是立即变化的。)通过CATransaciton(事务)处理隐式动画的执行(+setDisableActions:)。
2,UIView 层改变背景色并不会有这样的隐式动画,而是立即去改变的。我们知道了隐式动画的实现原理,而且每个UIView对它的关联图层而言相当于一个委托,并且实现了-actionForLayer:forKey方法。在动滑block的范围内,-actionForLayer:forKey返回非空值,不在动画块的实现中,UIView对所有的图层行为返回nil。
3,呈现与模型
改变CALayer的属性并没有立刻生效,而是通过一段时间渐变更新。下面我们讲探讨这是怎么做到的?
当我们改变CALayer的一个属性时,CALayer的属性值是立马改变的,只是我们改变的属性没有直接调整图层的外观,它只是定义了图层动画结束之后图层如何显示的模型。其实这里涉及到一个微型的MVC模式。
——Core Animation类似控制器,负责根据图层行为和事务的设置去不断的更新屏幕上这些属性的状态
——CALayer类似模型,它是连接用户界面的虚构的类,存储了视图如何显示和动画的数据模型。apple文档中写有”图层树通常都是值的图层树模型”
——呈现图层,是模型图层的复制,呈现图层上的属性值代表了当前屏幕显示的外观效果的属性的值,可以使用-presentationLayer方法来获取当前屏幕上属性的真正显示的值
呈现图层是由呈现树中的所有图层的的呈现图层所形成。呈现图层是在图层首次在屏幕上显示的时候创建的。如果在创建之前调用图层的-presentationLayer将会返回nil。在呈现图层上调用-modelLayer方法会返回它所呈现的图层的依赖图层(这就可以说明我们创建的原始图层是一种数据模型)
由MVC模式,我们可以了解,大多数情况下。我们不需要直接访问呈现图层,我们可以通过和模型图层(也就是我们创建的图层)交互,让Core Animation来更新显示呈现图层。下面两种情况利用呈现图层更方便
(1)同步动画:实现基于定时器的动画时(不是基于事务的动画),使用呈现图层可以准确的知道某一时刻图层的显示位置,有利于正确的摆放图层
(2)处理用户交互:想让做动画的图层响应用户的输入时,在呈现图层上使用-hitTest:方法来判断指定图层是否被触摸。因为呈现图层代表了用户当前看到的图层位置,而不是当前动画结束之后的位置。
动画属性
opacity 透明度
backgroundColor 背景颜色
cornerRadius 圆角
borderWidth 边框宽度
contents 内容
shadowColor 阴影颜色
shadowOffset 阴影偏移量
shadowOpacity 阴影透明度
shadowRadius 阴影圆角
...
rotation 旋转
transform.rotation.x
transform.rotation.y
transform.rotation.z
...
scale 缩放
transform.scale.x
transform.scale.y
transform.scale.z
...
translation 平移
transform.translation.x
transform.translation.y
transform.translation.z
...
position 位置
position.x
position.y
...
bounds
bounds.size
bounds.size.width
bounds.size.height
bounds.origin
bounds.origin.x
bounds.origin.y
关键帧动画的计算模式calculationMode:
CA_EXTERN NSString * const kCAAnimationLinear 默认值,关键帧之间直接直线相连进行插值计算
CA_EXTERN NSString * const kCAAnimationDiscrete 离散的,就是不进行插值计算,所有关键帧直接逐个进行显示
CA_EXTERN NSString * const kCAAnimationPaced 动画均匀进行,此时keyTimes和timingFunctions的设置失效
CA_EXTERN NSString * const kCAAnimationCubic 关键帧进行圆滑曲线相连后插值计算,对于曲线的形状还可以通过tensionValues,continuityValues,biasValues来进行调整自定义(http://en.wikipedia.org/wiki/Kochanek-Bartels_spline),这里的主要目的是使得运行的轨迹变得圆滑
CA_EXTERN NSString * const kCAAnimationCubicPaced 在kCAAnimationCubic的基础上使得动画运行变得均匀,就是系统时间内运动的距离相同,此时keyTimes以及timingFunctions也是无效的
动画沿路径旋转方式rotationMode,默认为nil,系统提供了两种方式:
CA_EXTERN NSString * const kCAAnimationRotateAuto 沿路径旋转
CA_EXTERN NSString * const kCAAnimationRotateAutoReverse 沿路径反向颠倒旋转