前言


核心动画使用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. cs231n spring 2017 lecture2 Image Classification 听课笔记

    1. 相比于传统的人工提取特征(边.角等),深度学习是一种Data-Driven Approach.深度学习有统一的框架,喂不同的数据集,可以训练识别不同的物体.而人工提取特征的方式很脆弱,换一个物体 ...

  2. vim与外部文件的粘帖复制

    vim与外部文件的粘帖复制 ubuntu默认vim是不支持从外部文件与vim之间的粘帖复制,vim有自己的剪切版,分别是”0-”9,”-,”8,”+,”:,”/,”%,”i,这些都是vim的寄存器,可 ...

  3. HTML5基础篇章1

    ①<!DOCTYPE>(声明文档类型): <!DOCTYPE>必须要声明在文档的第一行,而且要在html标签之前 . <!DOCTYPE>是一条规定页面使用那个ht ...

  4. c语言基础学习05

    =============================================================================涉及到的知识点有:for循环有两种写法.数组. ...

  5. linux基本命令学习02

    =============================================================================a.txtc:\abc\a.txt windo ...

  6. [随笔] 简单操作解决Google chrome颜色显示不正常的情况

    最近在用Linuxmint 真的是极友好的桌面Linux啊,然后用最新的Linuxmint自带的Firefox浏览器上网,发现颜色都变成了红色黄色变绿色,以为是显卡的问题,搞了一阵,无果.果断换Goo ...

  7. 函数iconv_substr和mb_substr

    二个函数iconv_substr和mb_substr,均可以在当前字符下进行字符串截取,以达到中文字符截取的不乱码. 应该如何选择呢? 1.iconv库在某些操作系统上可能运行不正确,需要安装GNU扩 ...

  8. thinkphp开发微信公众号时,验证基本配置提示请求url超时

    原因在index.php入口文件中必须有define('APP_NAME', 'Weixin'); 服务器url:http://bxu2713700584.my3w.com/Weixin/Index/ ...

  9. Phpstorm10 主题下载

    ================================================================================ submit:主题 http://ww ...

  10. vue中组件之间的相互调用,及通用后台管理系统左侧菜单树的迭代生成

    由于本人近期开始学习使用vue搭建一个后端管理系统的前端项目,在左侧生成菜单树的时候遇到了一些问题.在这里记录下 分析:由于本人设定的菜单可以使多级结构,直接使用vue的v-for 遍历并不是很方便. ...