iOS中CoreAnimation开发框架中Layer层动画相关

     Copyright © 2017年ZaneWangWang. All rights reserved.

CAAnimation动画体系的介绍

如果你看到的不是原文请看原文CoreAnimation开发框架中Layer层动画,想看应用实例请看我的另一篇文章iOS中Layer层CABasicAnimation和CAAnimationGroup应用

       CAAnimation是CoreAnimation框架中执行动画对象的基类,从CAAnimation中集成出三个子类分别是用于创建属性动画的CAPropertyAnimation,创建转场动画的CATransition和创建组合动画的CAAnimationGroup。

Layer层动画类继承关系

1.CAAnimation属性和方法

a.CAAnimation作为动画对象的基类,其中封装了动画的基础属性,如下:

 + (instancetype)animation;//通过类方法创建一个CAAnimation对象

@property(nullable, strong) CAMediaTimingFunction *timingFunction;//动画执行的时序模式

@property(nullable, strong) id delegate;//代理

@property(getter=isRemovedOnCompletion) BOOL removedOnCompletion;//是否动画完成时将动画对象移除掉

b.timingFunction定义了动画执行的时序效果,CAMediaTimingFunction的创建方式如下:

+ (instancetype)functionWithName:(NSString *)name;

name参数决定的执行的效果,可选参数如下

NSString * const kCAMediaTimingFunctionLinear;//线性执行

NSString * const kCAMediaTimingFunctionEaseIn;//淡入  在动画开始时 淡入效果

NSString * const kCAMediaTimingFunctionEaseOut;//淡出 在动画结束时 淡出效果

NSString * const kCAMediaTimingFunctionEaseInEaseOut;//淡入淡出

NSString * const kCAMediaTimingFunctionDefault;//默认效果

c.CAAnimation的代理方法入如下几个:

- (void)animationDidStart:(CAAnimation *)anim;//动画开始时执行的回调

- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag;//动画结束后执行的回调

2.CAPropertyAnimation属性与方法

a.CAPropertyAnimation是继承于CAAnimation专门用来创建与属性相关的动画的类:

+ (instancetype)animationWithKeyPath:(nullable NSString *)path;//创建对象 参数path就是执行动画的属性的字符串

例如:要修改透明度path就传@"alpha";

@property(getter=isAdditive) BOOL additive;//动画执行状态是否叠加在控件原状态上,默认为NO

@property(getter=isCumulative) BOOL cumulative;//对于重复动画来说,默认为NO从起始状态开始,YES表示在上一次执行基础之上执行

@property(nullable, strong) CAValueFunction *valueFunction;//和transfron属性的动画执行相关,通过这个参数,可以帮助我们直接操作transfrom3D属性变化产生动画效果

例如:做一个z轴的旋转动画

CABasicAnimation * animation = [CABasicAnimation animationWithKeyPath:@"transform"];

animation.fromValue = @0;//从0度开始

animation.toValue = [NSNumber numberWithFloat:M_PI];//旋转到180度

animation.duration = 2;//时间2S

animation.valueFunction = [CAValueFunction functionWithName:kCAValueFunctionRotateZ];//设置为z轴旋转,实际上我们也可以不设置这个属性,只需要在创建动画对象的时候的path变为@"transform.rotation.z"也可以访问到这个属性

[layer addAnimation:animation forKey:@""];//执行动画

3.CABasicAnimation属性

CABasicAnimaton是CAPropertyAnimation分出来的一个子类,创建基础的属性变化动画,例如我们上面的示例代码,其中属性如下:

@property(nullable, strong) id fromValue;//对应属性动画开始值

@property(nullable, strong) id toValue;//对应属性动画结束值

@property(nullable, strong) id byValue;///和fromeValue配合对应属性动画开始值到fromValue+byValue,和toValue配合从toValue-byValue到toValue

具体确定动画方案如下:

(1)fromValue和toValue不为空:动画的值由fromValue变化到toValue

(2)fromValue和byValue不为空:动画的值由fromValue变化到fromValue+byValue

(3)byValue和toValue不为空:动画的值由toValue-byValue变化到toValue

(4)只有fromValue不为空:动画的值由fromValue变化到layer的当前状态值

(5)只有toValue不为空:动画的值由layer当前的值变化到toValue

(6)只有byValue不为空:动画的值由layer当前的值变化到layer当前的值+byValue

4.CAKeyframeAnimation关键帧动画

CAKeyframeAnimation也是继承与CAPropertyAnimation的一个子类,其与CABasicAnimation的不同之处在于虽然其都是改变layer层属性的动画,但是CABasicAnimation只能设置初始与结束状态,这之间我们没办法控制,而CAKeyframeAnimation可以让我们设置一些关键帧再整个动画的过程中。属性方法如下:

@property(nullable, copy) NSArray *values;//关键帧的值数组 例如我们想让控件沿某个路径移动,这里面存放每个移动的点

例如:

CAKeyframeAnimation * ani = [CAKeyframeAnimation animationWithKeyPath:@"position"];

ani.values = @[[NSValue valueWithCGPoint:CGPointMake(100, 100)],[NSValue valueWithCGPoint:CGPointMake(120, 100)],[NSValue valueWithCGPoint:CGPointMake(120, 200)],[NSValue valueWithCGPoint:CGPointMake(200, 200)]];

ani.duration = 3;

[layer addAnimation:ani forKey:@""];

@property(nullable) CGPathRef path;//直接设置路径,作用域values类似

@property(nullable, copy) NSArray *keyTimes;//设置每一帧执行的时间长短 这个的取值为0-1,代表占用时间的比例

@property(nullable, copy) NSArray *timingFunctions;//每一帧的时序效果,详见CAAnimation介绍b条

@property(copy) NSString *calculationMode;//设置帧的中间值如何计算

有以下几种:

NSString * const kCAAnimationLinear;

NSString * const kCAAnimationDiscrete;

NSString * const kCAAnimationPaced;

NSString * const kCAAnimationCubic;

NSString * const kCAAnimationCubicPaced;

5.CATransition转场动画

CATransition和CAPropertyAnimation的不同之处在于当layer层出现时,会产生动画效果,而并不是属性改变时,属性如下:

@property(copy) NSString *type;//设置动画类型

动画类型有:

NSString * const kCATransitionFade;//淡入

NSString * const kCATransitionMoveIn;//移入

NSString * const kCATransitionPush;//压入

NSString * const kCATransitionReveal;//溶解

@property(nullable, copy) NSString *subtype;//设置动画的方向

动画方向有:

NSString * const kCATransitionFromRight;//从右侧进

NSString * const kCATransitionFromLeft;//从左侧进

NSString * const kCATransitionFromTop;//从上侧进

NSString * const kCATransitionFromBottom;//从下侧进

其实,关于type定义的动画效果,出来官方定义的,我们还可以使用一些私有的参数,如下:

(1)pageCurl   翻页

(2)rippleEffect 滴水效果

(3)suckEffect 收缩效果,如一块布被抽走

(4)cube 立方体效果

(5)oglFlip 上下翻转效果

例如:

CATransition * ani = [CATransition animation];

ani.type =  @"pageCurl";

ani.subtype = kCATransitionFromRight;

[layer addAnimation:ani forKey:@""];

6.CAAnimationGroup动画组

CAAnimationGroup本身并没有定义动画,他可以将我们上面提到的相关动画进行组合:

@property(nullable, copy) NSArray *animations;//动画组

高级动画技巧

1.事务类

CoreAnimation中还有一个非常重要的类:CATransaction事物类,这个可以同时设置多个layer层的动画效果。可以通过隐式和显式两种方式来进行动画操作。

2.CATransaction属性

对layer层的属性操作,都会形成隐式动画,要使用隐式动画,需要关闭layer层的animation动画属性,使用下面的方法:

+ (BOOL)disableActions;//关闭animation动画效果,开启隐式动画

+ (void)setDisableActions:(BOOL)flag;

CATransaction用类方式通过设置key-value来进行动画的属性设置:

+ (nullable id)valueForKey:(NSString *)key;

+ (void)setValue:(nullable id)anObject forKey:(NSString *)key;

支持的key值如下:


NSString * const kCATransactionAnimationDuration;//设置动画持续时间

NSString * const kCATransactionDisableActions;//设置停用animation类动画

NSString * const kCATransactionAnimationTimingFunction;//设置动画时序效果

NSString * const kCATransactionCompletionBlock;//设置动画完成后的回调

除了隐式的展示动画外,也可以显式的通过调用CATransaction的相关方法进行显示的提交动画:

+ (void)begin;//动画开始

+ (void)commit;//提交动画

+ (void)flush;//立即进行动画渲染 一般不需调用

下面这两个方法用于动画事物的加锁与解锁 在多线程动画中,保证修改属性的安全

+ (void)lock;

+ (void)unlock;

本文借鉴脚本之家大神博文

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容