轻松掌握 Core Animation

在日常开发中或多或少都会用到动画知识,想把动画做的特别炫酷还是需要很多积累的,希望和大家一起学习,共同进步,😀
一说起动画,大家肯定首先想到的是给 UIView 添加动画,

[UIView animateWithDuration:<#(NSTimeInterval)#> animations:<#^(void)animations#>];

这确实可以满足我们一些需求,但是有很多不足,比如,没法暂停,给动画进行组合,而且我们也并不知道它内部的实现原理,
今天我们要学习的是 Core Animation, 又叫核心动画,先来看一幅图,

核心动画分支结构.png

上面这一副图就是核心动画的结构,在 iOS 中动画可以分为 基础动画, 关键帧动画, 组动画, 转场动画
并且 CAAnimation 遵守 CAMediaTiming 协议,

下面先不说这些分类,先让我们来了解一下 CAAnimation 本身有哪些属性,
首先我们需要知道 CALayer 的一些知识,CALayer了解

CAAnimation的几个属性:
** timingFunction **:
指动画的节奏,就是动画快慢的交替情况,有以下几种情况:

  • kCAMediaTimingFunctionLinear // 线性节奏,就是匀速
  • kCAMediaTimingFunctionEaseIn // 淡入,缓慢进入,然后匀速
  • kCAMediaTimingFunctionEaseOut // 淡出, 匀速进入,然后缓慢出去
  • kCAMediaTimingFunctionEaseOut // 淡入淡出
  • kCAMediaTimingFunctionDefault // 默认特效

delegate:他所拥有的代理方法有

  • -(void)animationDidStart:(CAAnimation *)anim; // 开始动画
  • -(void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag; // 结束动画
    其中,在结束动画方法中,有一个参数 flag, 意思是如果动画正常播完了,flag 为 YES,如果没有播放完整或者被移除了, flag 为 NO,

** removedOnCompletion**
这是一个 BOOL 类型, 意思是 是否在动画播放完成后移除,
如果我们希望在动画播放完成后保留播放效果,一定要把这个属性设置为 NO,否则就不会保留

CAAnimation 还遵守了 CAMediaTiming 协议,他其中还有一些属性,
** beginTime**
动画开始的时间, 就是说动画在多长时间后开始播放,比如说你设置 beginTime = 2,那么动画就会在加载进 layer 以后再等 2s 才播放,
官方文档的介绍是:

   Specifies the begin time of the receiver in relation to its parent object, if applicable. 

意思是 beginTime 与他的父类对象有关系
由于 CALayer 和 CAAnimation 都遵守 CAMediaTiming,所以他们都可以成为我们 animation 对象的父对象
如果你将 animation 添加到一个动画组中,这种情况下可以直接设置 animation 的 beginTime

但是如果你将 animation 添加到 layer 上,这个layer的时间线很可能是一个过去的时间。即使你添加上beginTime得到的仍旧是一个过去的时间。那么这个时候我们的动画就会显示在动画结束时的状态。为了避免这种状况,我们要修正我们的时间。代码如下:

CFTimeInterval time = [layer convertTime:CACurrentMediaTime() fromLayer:nil];
animation.beginTime = time + beginTime;

CACurrentMediaTime()是马赫时间,是全局时间,也就是设备距离上次开机的时间。

convertTime是获取本地时间。该方法有两个参数,第一个是时间,第二个是时间所对应的图层。当第二个参数为nil时,则返回的就是第一个参数的值。
想要进一步了解的同学可以参考[CAMediaTiming 协议属性详解]
timeOffset
动画的偏移,也就是本该从第0秒开始的动画,如果我们设置了 timeOffset后,动画就会从 这个timeOffset 时间执行,
fillMode
播放结束时的状态,枚举

  • kCAFillModeForwards // 保持结束时状态
  • kCAFillModeBackwards // 保持开始时状态
  • kCAFillModeBoth // 保持两者,
  • kCAFillModeRemoved // 移除状态
    这个属性使用的时候一定要先设置
    removedOnCompletion = NO,不移除状态
    如果不设置,则不起作用
    参考文章:
    老司机带你走进Core Animation 之CAAnimation
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,367评论 6 512
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,959评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,750评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,226评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,252评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,975评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,592评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,497评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,027评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,147评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,274评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,953评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,623评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,143评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,260评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,607评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,271评论 2 358

推荐阅读更多精彩内容