前言


核心动画使用action对象实现它的可视化动画。一个action对象是指遵循CAAction协议并定义了Layer相关的动画行为的对象。所有的CAAnimation对象实现了这个协议,无论何时Layer的属性发生变化的时候就会执行对应的action对象(包含CAAnimation对象)。

可动画的属性是action的一种类型,我们可以定义几乎所有我们想要的actions,为了达成这个目的,我们就需要定义自己的action并把它们关联到Layer对象

 

自定义遵守CAAction协议的Action对象


为了创建我们自己的action对象,需要让我们的类遵守CAAction协议并实现runActionForKey:object:arguments:方法。在这个方法中使用可用的信息执行任何我们想要在相应的Layer上执行的action。我们可能使用这个方法将动画对象添加到相应的Layer上,或者使用它去执行其他的任务。

当我们定义一个action对象的时候,我们必须设定这个action将如何被触发的方式。Action的触发方式是需要定义一个Key,我们然后使用这个Key注册该action。Action对象能够通过下面任何一种情景触发:

  • Layer的属性被改变时。这可以是Layer的任意一个属性并且可以是不可动画的属性,(我们也能将actions关联到我们为Layer添加的自定义属性。)那么定义这个action的Key就是属性的名称。
  • 当Layer变为可视化或者是被添加到图层时,此action的key是kCAOnOrderIn
  • 当Layer从图层中移除的时候,此action的Keys是kCAOnOrderOut
  • 当Layer将要开始transition动画时,此action的key是KCATransition

 

为了产生特定效果,action对象必须存在于Layer中


在action能够被执行前,Layer需要先找到对应的要执行的action。(和Layer相关的action)Key是正在被改变的属性名或者定义该action的特殊字符串。当某个事件发生在Layer上的时候,Layer会调用actionForKey:方法通过相应的Key搜索action对象;在搜索期间,我们APP中可以在以下几个地方插入代码,并为那个Key提供相关的action对象。

核心动画按照下面的顺序查找action对象:

  1. 如果Layer对象有代理并且那个代理实现了actionForLayer:forKey:方法,Layer会调用这个方法。代理必须完成下面所列的其中之一:

    • 返回指定的Key对应的action对象。
    • 如果该代理方法中不处理此Key相关的action,则返回nil,这种情况下会继续搜索看监控监控就看见看监控监控就看见看监控监控就看见看监控监控。
    • 返回NSNull对象,此时,搜索会立即结束。
  2. Layer对象会在Layer的actions字典中根据指定的Key进行查找。
  3. Layer对象查找style字典获取包含该Key的actions字典(换句话说,style字典包含了一个actions的key对应的value,而这个value也是个字典,Layer会根据Key在这个value字典中查询。)
  4. Layer调用defaultActionForKey:类方法。
  5. 如果查找到隐式的action,Layer执行核心动画定义的隐式的action。

如果我们在上述搜索的地方提供action对象,Layer将会停止搜索并执行所返回的action对象。当他找到action对象,Layer会调用那个对象的runActionForKey:object:arguments:方法执行动画。如果我们定义的action对象是某个CAAnimation类的实例,我们可以使用那个方法的默认实现执行动画;如果是我们自定义的遵守CAAction协议的对象,就必须让自定义的对象去实现那个方法来执行动画。

我们在那替换为自己写的action对象取决于我们打算如何调整Layer。

  • 对于我们仅仅想应用到特殊环境的actions,或者对于已经使用代理的Layer,只需要提供代理并实现它的actionForLayer:forKey:方法。
  • 对于没有正常使用代理的Layer对象,需要为layer的actions字典添加相应的Key和action。
  • 对于在Layer对象中自定义属性相关的actions,需要将action添加到Layer的style字典中。
  • 对于和Layer基本的动画的actions,继承Layer类,并重写defaultActionForKey:方法。

    代码6-1展示了用于提供action对象的代理方法的实现。这种情况是,代理查找Layer的contents属性,使用心得contents替换掉旧的,并使用transition动画。

代码6-1 使用Layer的代理提供一个action


- (id<CAAction>)actionForLayer:(CALayer *)theLayer
forKey:(NSString *)theKey {
CATransition *theAnimation=nil; if ([theKey isEqualToString:@"contents"]) { theAnimation = [[CATransition alloc] init];
theAnimation.duration = 1.0;
theAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
theAnimation.type = kCATransitionPush;
theAnimation.subtype = kCATransitionFromRight;
}
return theAnimation;
}

 

使用CATransaction类临时禁止Actions


使用CATransaction(我们可以临时禁止Layer的actions。当我们改变Layer的属性,核心动画通常创建隐式的transaction对象,然后执行动画式的过度变化;如果我们不想要这个默认的动画执行,通过创建显式的transaction和设置他的kCATransactionDisableActions属性为true,就可以达到禁止隐式动画的目的了。代码6-2展示了当从图层树上移除指定的Layer的时候,我们禁止隐式动画的一段代码。

临时禁止Layer的actions


[CATransaction begin];
[CATransaction setValue:(id)kCFBooleanTrue
forKey:kCATransactionDisableActions];
[aLayer removeFromSuperlayer];
[CATransaction commit];

关于更多使用transaction对象管理动画行为的信息参见:显式动画帮助我们改变动画参数

Core Animation 文档翻译 (第七篇)——改变Layer的默认动画的更多相关文章

  1. Core Animation 文档翻译 (第一篇)

    Core Animation 文档翻译(第一篇)   2018-01-13  星期6 前言:作为iOS 开发,官方文档的阅读是很有必要的,值此周末便写下此文.作为iOS 实际经验3年的开发,之前的应用 ...

  2. Core Animation文档翻译 (第一篇)

    Core Animation 文档翻译(第一篇) 前言 作为iOS 开发,官方文档的阅读是很有必要的,值此周末便写下此文.作为iOS 实际经验3年的开发,之前有阅读并实践过经典的<iOS核心动画 ...

  3. Core Animation 文档翻译 (第二篇)

    Core Animation 文档翻译 (第二篇) 核心动画基础要素 核心动画为我们APP内Views动画和其他可视化元素动画提供了综合性的实现体系.核心动画不是我们APP内Views的替代品,相反, ...

  4. Core Animation 文档翻译 (第六篇)

      高级动画技巧 配置属性动画或者关键帧动画的方式是多种多样的.需要同时执行多个动画或者顺序执行多个动画的APP,可以通过高级的方式同步这些动画的timing或者将这些动画绑定在一起.我们也可以使用其 ...

  5. Core Animation 文档翻译(第三篇)

    Core Animation 文档翻译(第三篇) 设置Layer对象 当我们使用核心动画时,Layer对象是一切的核心.Layers 管理我们APP的可视化content,Layer也提供了conte ...

  6. Core Animation 文档翻译 (第四篇)

    Core Animation 文档翻译(第四篇) 让Layer的content动画起来 核心动画的基础接口以及为拥有Layer的View做的动画扩展接口,使得为Layer制作复杂动画变得简单化.例如改 ...

  7. Core Animation 文档翻译—附录A(Layer样貌相关属性动画)

    前言   在渲染过程中,核心动画获取Layer的各种属性并以特定的顺序渲染他们.这个顺序决定了Layer的最终的样貌.本节将会阐述通过设置不同的Layer样貌相关属性对应产生的渲染结果. 注意:Mac ...

  8. Core Animation 文档翻译—附录C(KVC扩展)

    前言   关于CAAnimation和CALayer类,核心动画扩展了NSKeyValueCoding协议.这个扩展为一些keys添加了默认值,扩大了封装协议,添加了为CGpoint.CGRect.C ...

  9. Core Animation 文档翻译—附录B(可动画的属性)

    前言   许多CALayer和CIFliter的属性都是可动画的.本节附录列出了这些属性默认使用的动画.   CALayer可动画属性   表B-1展示了CALayer类的可动画属性.针对每个属性此表 ...

随机推荐

  1. 2017"百度之星"程序设计大赛 - 复赛1005&&HDU 6148 Valley Numer【数位dp】

    Valley Numer Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  2. Codeforces 839A Arya and Bran【暴力】

    A. Arya and Bran time limit per test:1 second memory limit per test:256 megabytes input:standard inp ...

  3. 51Nod 1016 水仙花数 V2(组合数学,枚举打表法)

    1016 水仙花数 V2 基准时间限制:1 秒 空间限制:131072 KB 分值: 160         难度:6级算法题                水仙花数是指一个 n 位数 ( n≥3 ) ...

  4. 51Nod 1632 B君的连通(递归,快速幂)

    1632 B君的连通 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 B国拥有n个城市,其交通系统呈树状结构,即任意两个城市存在且仅存在一条交通线将其连接.A国是B ...

  5. c++(hash表)

    hash表,有时候也被称为散列表.个人认为,hash表是介于链表和二叉树之间的一种中间结构.链表使用十分方便,但是数据查找十分麻烦:二叉树中的数据严格有序,但是这是以多一个指针作为代价的结果.hash ...

  6. [国嵌攻略][061][2440LCD驱动设计]

    LCD初始化 1.引脚初始化 2.时序初始化 VBPD(vertical back porch):表示在一帧图像开始时,垂直同步信号以后的无效的行数 VFBD(vertical front porch ...

  7. html dl dt dd标签元素语法结构与使用

    dl dt dd认识及dl dt dd使用方法 标签用于定义列表类型标签. dl dt dd目录 dl dt dd介绍 结构语法 dl dt dd案例 dl dt dd总结 一.dl dt dd认识 ...

  8. 常用排序算法java实现

    写在前面:纸上得来终觉浅.基本排序算法的思想,可能很多人都说的头头是到,但能说和能写出来,真的还是有很大区别的. 今天整理了一下各种常用排序算法,当然还不全,后面会继续补充.代码中可能有累赘或错误的地 ...

  9. Angular CLI: 发布到 GitHub Pages

    发布 Angular 应用的简单方式是使用 GitHub Pages. 首先需要创建一个 GitHub 账号,随后,为您的项目创建一个仓库.记下 GitHub 中的用户名和项目名称. 例如,我的 Gi ...

  10. 人人都是CEO

    在这个互联网崛起的时代有些流行说法,比如:人人都是产品经理,人人都是程序员以突显行业繁荣的特点,但从更基本的出发点,难道人人不都是 CEO 么?个人的 CEO. 从这个名字套路出发,我沿着想了下去,作 ...