前言


核心动画使用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. Flask源码流程剖析

    在此之前需要先知道类和方法,个人总结如下:  1.对象是类创建,创建对象时候类的__init__方法自动执行,对象()执行类的 __call__ 方法 2.类是type创建,创建类时候type的__i ...

  2. Java反射-中级知识掌握

    PS:本文就Java反射常用的中级知识做下汇总和分析/cnxieyang@163.com/xieyang@e6yun.com

  3. SpringBoot(四)之thymeleaf的使用

    这篇文章将更加全面详细的介绍thymeleaf的使用.thymeleaf 是新一代的模板引擎,在spring4.0中推荐使用thymeleaf来做前端模版引擎. thymeleaf介绍 简单说, Th ...

  4. hihoCoder1498-Diligent Robots

    #1498 : Diligent Robots Time Limit:10000ms Case Time Limit:1000ms Memory Limit:256MB Description The ...

  5. string::npos的一些说明

    一.定义 std:: string ::npos的定义: static const size_t npos = -1; 表示 size_t 的最大值( Maximum value for size_t ...

  6. C# 构造器总结

    在C#中,构造器分为实例构造器和类型构造器, 一.实例构造器 构造引用类型的对象时,在调用实例 构造器之前,为对象分配的内存总是归0,没有被构造器显示重写的字段都保证获得0或null的值 在一个类中, ...

  7. UEP-按钮控制及时间

    按钮的判断 var record = ajaxgrid.getAllRecords(); if(record.length>0){ var isPack=record[0].get(" ...

  8. PHPStudy+PHPStorm下配置隐藏项目入口文件

    img { max-width: 100% } 默认情况下项目入口文件是站点根目录下index.php文件,一般程序启动时通过这个文件,定义文件路径,配置重要节点(比如是否开启调试模式),注册路由等, ...

  9. dedecsm系统(企业简介)类单栏目模版如何修改和调用整理

    作者:佚名 字体:[增加 减小] 来源:互联网 时间:01-15 17:33:07 我要评论 我们的模版里应该都有article_article.htm这个模版;article_article.htm ...

  10. 利用PHPExcel导出Excel并设置Excel格式以及数据源

    浏览:23969 发布日期:2013/07/24 分类:技术分享 代码有点长,读起来有点累.先来个截图 导出的Excel太宽了,所以将后面的列宽重新调整了再截的图 功能包括: 1.设置单元格格式,包括 ...