理解Core Animation

理解Core Animation


三种树状结构

  • 图层树:模型对象,携带动画结束后CALayer对象属性的目标值。修改图层对象的属性值,就是修改图层树中模型对象。
  • 呈现树:模型对象,携带动画进行期间CALayer对象属性的当前值。通过访问这些对象,获取图层对象属性的当前值。
  • 渲染树:框架的私有对象,具体负责动画渲染。

CALayer

  • bounds:设置其origin成员变量没有作用。

  • 使用non layer-backed时,要将其属性contentsScale设置为[UIScreen mainScreen].scale;否则图层所显示内容的缩放系数会同屏幕的实际缩放系数不一致。

  • 手动调用图层的setNeedsDisplay方法,其drawInContext:或代理方法drawLayer:inContext:才会被调用。

  • 时间转换

  • layer.speed = 0;

  • convertTime:toLayer:

  • convertTime:fromLayer:,注意,给后一个参数传nil,一般用于将系统绝对时间转换为图层本地时间,如:

// 将系统绝对时间转换为图层本地时间(考虑到speed等因素)
CFTimeInterval localTime = [self.layer convertTime:CACurrentMediaTime() fromLayer:nil];

动画触发类型

  • 隐式动画,不创建CAAnimation对象,直接修改CALayer对象的属性,自动产生动画效果。
  • 更新图层树中相应的属性值至动画将结束状态。即动画结束后,图层对象的状态就是动画的终止状态。
  • 对于UIViewroot layer,必须在animation block中进行修改,否则不会产生隐式动画。
  • 对于在animation block外的隐式动画来说,其duration默认0.25秒。相反,其duration等同于动画block的duration参数。
// 数据流向
交割对象--->图层树--->绘图树--->呈现树
  • 显示动画:创建并配置CAAnimation,将其添加至CALayer对象,从而产生动画效果。
  • 不更新图层树中相应的属性值。即动画结束后,图层对象回到动画执行前的状态。
  • 直接作用于对于UIViewroot layer,不必放入animation block中。
  • 如果将显式动画放在animation block,一样可以执行。但其duration不会被覆盖,默认为0.25(如果没有设置)或设定值
// 数据流向
交割对象--->绘图树--->呈现树

CAAnimation

  • removedOnCompletion:动画结束后,动画模型是否被移除CALayeranimations字典。
  • 注意,这个属性需要和fillMode配合使用,后者决定动画模型带来的呈现效果在动画结束后是否保留。例如,想要让CALayer对象在每次动画结束后都保持动画结束后的状态,需要如下设置:
// 保持动画结束时的状态
anim.removedOnCompletion = NO; // 注意,这个属性默认YES,即动画结束后,动画模型将从`CALayer`中移除。如果动画模型不再存在,其呈现效果肯定也不会存在。
anim.fillMode = kCAFillModeForwards;
  • 注意,冻结动画状态不代表修改了图层树中属性模型的值;相反,属性值保持不变,修改的和保存的仅仅是呈现树中的模型。

  • 代理方法

  • animationDidStart:,动画开始时调用。

  • animationDidStop:finished: ,动画结束,或者从图层上移除时调用。

  • 注意,不需遵守代理协议,只需将对象设置为动画模型的delegate即可。

  • 注意,动画模型对其delegate进行强引用


CAPropertyAnimation / 属性动画

  • animationWithKeyPath:,创建一个属性动画对象,并为其指定相对于CALayer对象属性的keyPath
CABasicAnimation / 差值动画
  • 差值计算方法
  • fromValue,简称'f'。
  • toValue,简称't'
  • byValue,简称'b'。
 组合  | 起点 | 终点
 ---- | ----- | -----
 f + t  | f | t 
 f + b  | f | f + b
 t + b  | t - b | t
 f  | f | 当前值
 t  | 当前值 | t
 b  | 当前值 | 当前值 + b
 都不存在  | 之前值 | 当前值(需要手动修改`CALayer`对象的属性值)
CAKeyFrameAnimation / 关键帧动画
  • path, 用于定义CGPoint类型属性的关键帧。

  • keyTimes:包含若干个NSNumber的数组,元素个数等于values.count或者pathcontrol point的数量。

  • 元素的值限定在0.0~1.0之间,代表关键帧在整个动画中的介入时机。(例如,@[@0, @0.5 @1.0]表示关键帧依次在动画总持续时间的%0,%50和%100开始执行)

  • 这个属性只在特定的calculation mode下有效。

  • calculationMode,关键帧之间的过渡值的计算方式。

kCAAnimationLinear; // 线性计算(适用keyTimes值)
kCAAnimationDiscrete; // 离散计算,即不计算过渡值(适用keyTimes值)
kCAAnimationPaced; // 同步计算,即平均计算
kCAAnimationCubic; // 立方计算(适用keyTimes值)
kCAAnimationCubicPaced; // 立方同步计算

CAAnimationGroup / 分组动画

  • 用于同时触发多个动画效果。
  • 分组动画的属性会覆盖其子动画模型的相同属性。
  • 注意,如果一个子动画的duration为10秒,而分组动画时长为5秒。那么子动画只能显示其前5秒的动画效果。

CATransition / 转场动画

  • 利用预先保存的图层内容(位图),为视图创建转场动画效果。
  • startProgress,转场过程的开始位置。例如,将这属性设置为0.5,动画效果表现为从中间开始转场。
  • endProgress,转场过程的结束位置。例如,将这属性设置为0.5,动画效果表现为转场进行至一半就结束。
  • type,转场动画效果类型。 把私有效果列出来
  • subtype,转场动画效果方向。(有些效果设置这个属性无效)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容