UIView动画和Core Animation的关系的一点理解

在iOS开发的时候,如果想给用户界面加入一些简单的动画,那UIView动画一定是很多人的首选。因为它写起来非常简洁,只需要把将要改变的property值放入UIView的animation block中,比如:

[UIView animateWithDuration:5.0
                 animations:^{
                     myView.alpha = 0.5;
                 }];

但是我也一直疑惑,这样的写法,和使用CAAnimation有什么不同呢?有人说,UIView动画只是把Core Animation的一些操作封装了起来。虽然我也这么猜测,但是我打算写代码验证一下。

根据这篇苹果官方文档,我们可以得知,每一个view.layer都以该view作为其delegate,并通过询问view的actionForLayer:forKey:方法来获得自己应该执行的CAAction对象。

所以我自定义了一个XSQView类,继承自UIView,仅仅重写了其中的actionForLayer:forKey:方法:

- (id<CAAction>)actionForLayer:(CALayer *)layer forKey:(NSString *)event {
    id<CAAction> action = [super actionForLayer:layer forKey:event];
    NSLog(@"action for layer: %@, for key:%@ is %@", layer, event, action);
    return action;
}

用于观察UIView对它的layer提供了什么样的CAAction对象。

用UIView动画改变XSQView对象的property,比如:

[UIView animateWithDuration:5.0
                 animations:^{
                     xsqView.alpha = 0.5;
                 }];

可以发现,此时,XSQView中的actionForLayer:forKey:方法被多次调用,产生了这样的输出:

action for layer: <CALayer: 0x7fa952413150>, for key:bounds is <null>
action for layer: <CALayer: 0x7fa952413150>, for key:opaque is <null>
action for layer: <CALayer: 0x7fa952413150>, for key:position is <null>
action for layer: <CALayer: 0x7fa952413150>, for key:onOrderIn is <null>
action for layer: <CALayer: 0x7fa952413150>, for key:opacity is <CABasicAnimation: 0x7fa95275bc20>

<null>[NSNull null]的输出。说明对于其他的几种key,UIView对象告诉它的layer,停止对CAAction对象的搜索。而对opacity这个key,UIView对象则给出了一个CABasicAnimation对象。

打印这个CABasicAnimation对象的部分信息,发现这可能就是由UIView animation block中的代码转换出的CAAnimation。

<CABasicAnimation:0x7fa95275bc20; 
delegate = <UIViewAnimationState: 0x7fd811c376b0>; 
fillMode = both; 
timingFunction = easeInEaseOut; 
duration = 5; 
fromValue = 1;
keyPath = opacity>

(但是这个CABasicAnimation中的toValuebyValue都是nil)

另外,用类似的方式观察layer对象的行为(根据苹果官方文档,可以通过重载UIView中的layerClass方法来改变这个View使用的layer的类型。所以自定义一个CALayer的子类作为view的layerClass,并重写CALayer的部分方法起到监控CALayer行为的目的。),我发现layer的addAnimation:forKey:方法也被调用了,这个CABasicAnimation对象被加入到了layer中。

如果在UIView的animation block中,改变了一个view的多个property,则会有多个CAAnimation对象被加入到layer中。

我觉得到这里已经能表明,UIView动画其实就是对Core Animation的一种封装,向客户程序员呈现更简洁的接口。

但是我也发现了,在UIViewanimation block中改变position或者bounds等属性,会有一些特别的行为。因为这些属性可能对应着多个animation key。所以,从actionForLayer:forKey:中返回的对象也不是一个CAAnimation对象了,而是一个(没有公开的)_UIViewAdditiveAnimationAction对象。随后,可能有多个CAAnimation对象被加入到layer中。

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

推荐阅读更多精彩内容