coreanimation文档翻译(第七篇)—改变layer的默认动画

周小闲 周小闲     2022-10-14     272

关键词:

前言


核心动画使用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对象管理动画行为的信息参见:显式动画帮助我们改变动画参数

第七篇--如何改变vs2017版的背景

改变背景 C:\Users\zsunny\AppData\Local\Microsoft\VisualStudio\15.0_9709afbe\Extensions\o0g0c52k.3od\Images  查看详情

coreanimation文档翻译(第一篇)

CoreAnimation文档翻译(第一篇) 前言作为iOS开发,官方文档的阅读是很有必要的,值此周末便写下此文。作为iOS实际经验3年的开发,之前有阅读并实践过经典的<iOS核心动画高级技巧>,其gitbook地址,然总觉此书的翻译版,... 查看详情

coreanimation文档翻译(第一篇)

      CoreAnimation文档翻译(第一篇)    2018-01-13 星期6   前言:作为iOS开发,官方文档的阅读是很有必要的,值此周末便写下此文。作为iOS实际经验3年的开发,之前的应用之前有阅读并实践过经典的<i... 查看详情

web前端第七篇js的dom对象一

一、什么是HTML DOM HTML DocumentObjectModel(文档对象模型)   HTMLDOM定义了访问和操作HTML文档的标准方法   HTMLDOM把HTML文档呈现为带有元素、属性和文本的树结构(节点树)二、DOM树 画dom树是为了... 查看详情

coreanimation文档翻译(第二篇)

CoreAnimation文档翻译(第二篇)  核心动画基础要素 核心动画为我们APP内Views动画和其他可视化元素动画提供了综合性的实现体系。核心动画不是我们APP内Views的替代品,相反,它是一种结合Views来提供更好性能和支持Co... 查看详情

mongodb基础教程系列--第七篇mongodb聚合管道

...计和数据挖掘。在MongoDB中,聚合操作的输入是集合中的文档,输出可以是一个文档,也可以是多条文档。Mong 查看详情

coreanimation文档翻译(第五篇)

?构建Layer层次结构在APP中大多数情况下,将Layer和View对象结合使用是Layer最好的使用方式。然而,很多时候我们可能需要通过添加单独的Layer对象,以便增加视图继承层次;当为了提高性能,或为了实现View很难实现的特性,此时... 查看详情

coreanimation文档翻译(第六篇)

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

coreanimation文档翻译—附录c(kvc扩展)

前言?关于CAAnimation和CALayer类,核心动画扩展了NSKeyValueCoding协议。这个扩展为一些keys添加了默认值,扩大了封装协议,添加了为CGpoint、CGRect、CGSize和CATransform3D类型的支持。?KVC支持的集成类?CAAnimation和CALayer类是支持KVC的,这意... 查看详情

directx11第七篇光照模型——环境光

      本系列文章主要翻译和参考自《Real-Time3DRenderingwithDirectXandHLSL》一书(感谢原书作者),同时会加上一点个人理解和拓展,文章中如有错误,欢迎指正。      这里是书中的代码和资源。      本... 查看详情

coreanimation文档翻译—附录b(可动画的属性)

前言?许多CALayer和CIFliter的属性都是可动画的。本节附录列出了这些属性默认使用的动画。?CALayer可动画属性?表B-1展示了CALayer类的可动画属性。针对每个属性此表也列出了对应的默认动画对象的类型,这些动画以隐式的方式执行... 查看详情

coreanimation文档翻译(第八篇)—提高动画的性能

前言核心动画是提高基于APP动画帧率的好方式,但是核心动画的使用不代表性能的提升的保证。尤其在OSX,当使用核心动画时,我们仍需选择最有效的方式。和所有的性能相关的问题一样,我们应该使用工具时时的评估和跟踪APP... 查看详情

第七篇:面向对象高级

第七篇:面向对象高级   PYTHON-绑定方法反射内置函数PYTHON-组合封装多态property装饰器 查看详情

数据分析第七篇:相关分析(代码片段)

相关分析是数据分析的一个基本方法,可以用于发现不同变量之间的关联性,关联是指数据之间变化的相似性,这可以通过相关系数来描述。发现相关性可以帮助你预测未来,而发现因果关系意味着你可以改变世界。 一,协... 查看详情

测开之函数进阶篇・第七篇《装饰器》(代码片段)

目录装饰器开放封闭原则装饰器的作用装饰器的应用场景实现一个装饰器装饰器原理阐述带参数的装饰器装饰器装饰类定义一个时间装饰器装饰器开放封闭原则软件实体应该是可扩展、而不可修改的。也就是说,对扩展是开... 查看详情

第七篇图像分类的评价指标

文章目录摘要混淆矩阵准确率(Accuracy)精确率(Precision)召回率(Recall)F1-score代码样例 查看详情

第七篇图像分类的评价指标

文章目录摘要1、混淆矩阵2、准确率(Accuracy)3、精确率(Precision)4、召回率(Recall)5、F1-score6、代码样例 查看详情

第七篇-列表式app:listactivity及listview

一、新建一个emptyactivity的项目。二、修改MainActivity.java:extendsAppCompactActivity改为extendsListActivity。注释掉setContentView(R.layout.activity_main);packagecom.example.aimee.listapp;importandroid.app.ListActivity;im 查看详情