理解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,转场动画效果方向。(有些效果设置这个属性无效)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,524评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,869评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,813评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,210评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,085评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,117评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,533评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,219评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,487评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,582评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,362评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,218评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,589评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,899评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,176评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,503评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,707评论 2 335

推荐阅读更多精彩内容