Core Animation 文档翻译 (第七篇)——改变Layer的默认动画
前言
核心动画使用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对象:
- 如果Layer对象有代理并且那个代理实现了actionForLayer:forKey:方法,Layer会调用这个方法。代理必须完成下面所列的其中之一:
- 返回指定的Key对应的action对象。
- 如果该代理方法中不处理此Key相关的action,则返回nil,这种情况下会继续搜索看监控监控就看见看监控监控就看见看监控监控就看见看监控监控。
- 返回NSNull对象,此时,搜索会立即结束。
- Layer对象会在Layer的actions字典中根据指定的Key进行查找。
- Layer对象查找style字典获取包含该Key的actions字典(换句话说,style字典包含了一个actions的key对应的value,而这个value也是个字典,Layer会根据Key在这个value字典中查询。)
- Layer调用defaultActionForKey:类方法。
- 如果查找到隐式的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的默认动画的更多相关文章
- Core Animation 文档翻译 (第一篇)
Core Animation 文档翻译(第一篇) 2018-01-13 星期6 前言:作为iOS 开发,官方文档的阅读是很有必要的,值此周末便写下此文.作为iOS 实际经验3年的开发,之前的应用 ...
- Core Animation文档翻译 (第一篇)
Core Animation 文档翻译(第一篇) 前言 作为iOS 开发,官方文档的阅读是很有必要的,值此周末便写下此文.作为iOS 实际经验3年的开发,之前有阅读并实践过经典的<iOS核心动画 ...
- Core Animation 文档翻译 (第二篇)
Core Animation 文档翻译 (第二篇) 核心动画基础要素 核心动画为我们APP内Views动画和其他可视化元素动画提供了综合性的实现体系.核心动画不是我们APP内Views的替代品,相反, ...
- Core Animation 文档翻译 (第六篇)
高级动画技巧 配置属性动画或者关键帧动画的方式是多种多样的.需要同时执行多个动画或者顺序执行多个动画的APP,可以通过高级的方式同步这些动画的timing或者将这些动画绑定在一起.我们也可以使用其 ...
- Core Animation 文档翻译(第三篇)
Core Animation 文档翻译(第三篇) 设置Layer对象 当我们使用核心动画时,Layer对象是一切的核心.Layers 管理我们APP的可视化content,Layer也提供了conte ...
- Core Animation 文档翻译 (第四篇)
Core Animation 文档翻译(第四篇) 让Layer的content动画起来 核心动画的基础接口以及为拥有Layer的View做的动画扩展接口,使得为Layer制作复杂动画变得简单化.例如改 ...
- Core Animation 文档翻译—附录A(Layer样貌相关属性动画)
前言 在渲染过程中,核心动画获取Layer的各种属性并以特定的顺序渲染他们.这个顺序决定了Layer的最终的样貌.本节将会阐述通过设置不同的Layer样貌相关属性对应产生的渲染结果. 注意:Mac ...
- Core Animation 文档翻译—附录C(KVC扩展)
前言 关于CAAnimation和CALayer类,核心动画扩展了NSKeyValueCoding协议.这个扩展为一些keys添加了默认值,扩大了封装协议,添加了为CGpoint.CGRect.C ...
- Core Animation 文档翻译—附录B(可动画的属性)
前言 许多CALayer和CIFliter的属性都是可动画的.本节附录列出了这些属性默认使用的动画. CALayer可动画属性 表B-1展示了CALayer类的可动画属性.针对每个属性此表 ...
随机推荐
- Django----->inclusion_tag的使用
一种比较普遍的tag类型是只是渲染其它模块显示下内容,这样的类型叫做Inclusion Tag. 常用的模板标签是通过渲染 其他 模板显示数据的. 比如说,Django的后台管理界面,它使用了自定义的 ...
- js面向对象学习笔记(四):对象的混合写法
//对象的混合写法//1.构造函数function 构造函数() { this.属性}构造函数.原型.方法 = function () {};//调用var 对象1 = new 构造函数();对象1. ...
- set使用实例1+lower_bound(val)(个人模版)
set使用实例1+lower_bound(val): #include<stdio.h> #include<set> #include<iostream> #inc ...
- itoa函数,sprintf函数
itoa函数 itoa 为c语言的一个函数.itoa 函数是一个广泛应用的,从非标准扩展到标准的C语言.它不能被移植,因为它不是标准定义下的C语言,但是,编译器通常在一个不遵循程式标准的模式下允许其通 ...
- Convex(扫描线降维)
Convex Time Limit: 10000/4000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- android文件选择器、仿淘宝编辑页面、新手引导层等源码
Android精选源码 单片机和安卓应用,传感器 文件选择器 android滑动选择的尺子view源码 android视频录制 视频压缩的源码 仿今日头条顶部导航指示器源码 Android框架+常用控 ...
- c语言基础学习09_关于复合类型的复习
=============================================================================struct A{ char array[10 ...
- Unity 小笔记
1,Time.deltatime放在Update和fixedupdate中得到的值是不一样的.还以为是通过两个值来获取. 2,VR中绘制射线可以使用LineRender. 3,Unity中判断一个东西 ...
- 解除织梦dedeCMS标题/关键词/ 简略标题长度限制听语音
dedeCMS標題.關鍵詞和簡略標題長度有限制,展示不全. 三者均使用SQL修改dede_archives主表關鍵詞和簡略標題還需修改/dede/目錄中的: archives_add.php, ...
- IOS UI 滚动视图 UIScrollView
UIScrollView 常用属性 scrollView.maximumZoomScale= 2.0; // 缩放最大比例 scrollView.minimumZoomScale = 0.2;// ...