iOS动画--核心动画

使用核心动画不会给cpu造成负担,也不会拖慢app运行速度,更不会阻塞主线程。大部分工作都是由专门的图形硬件来渲染的。
该组件的核心是layer对象,核心动画大部分都是需要操作layer对象的属性来完成的。
核心动画几个类的继承结构如图:


structure.png

CAAnimation 核心动画的基类

核心动画的抽象类,继承自NSObject
CAAnimation提供遵守了CAMediaTiming和CAAction协议(同时还有NSSecureCoding和NSCopying)。使用时不会直接创建CAAnimation,一般都使用其子类CABasicAnimation,CAKeyframeAnimation,CAAnimationGroup,CATransition

来看看它的一些方法和属性:
+(instancetype)animation : 创建一个动画对象
delegate: 动画代理,类型是CAAnimationDelegate,动画开始和停止时会调用里面的代理方法
removeOnCompletion:默认为YES,动画结束时将动画移除。
timingFunction 表示动画执行的速度,默认是nil,表示匀速,其值有以下几个:

  1. kCAMediaTimingFunctionLinear 匀速
  2. kCAMediaTimingFunctionEaseIn 慢进
  3. kCAMediaTimingFunctionEaseOut慢出
  4. kCAMediaTimingFunctionEaseInEaseOut慢进慢出
  5. kCAMediaTimingFunctionDefault
    另外,CAMediaTimingFunction提供了几个方法来自定义速度,这儿不说啦***
CAAnimationDelegate

Methods your app can implement to respond when animation start and stop.
提供了一些方法实现,当动画开始或停止时给出响应
该代理只提供了两个方法:

- (void)animationDidStart:(CAAnimation *)anim;// 动画开始时被调用
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag;//动画结束时或动画被移除时都会调用,只有当动画正常完成时flag的值才为true
CAPropertyAnimation

继承自CAAnimation,是一个抽象类,是操作layer的property来实现动画的类。
使用动画的keypath指定与动画相关的property。
使用时不直接创建该类的实例,而是使用其子类CABasicAnimation 或 CAKeyframeAnimation
它的属性和方法:
+(instancetype)animationWithKeyPath:(nullable NSString *)path;创建设置了path的动画对象
@property(getter=isAdditive) BOOL additive;动画是否以当前动画效果为基础,默认为NO(表示再次执行动画时,会先回到最初状态再开始执行)
@property(getter=isCumulative) BOOL cumulative;动画效果是否累加,默认为NO
@property(nullable, strong) CAValueFunction *valueFunction;该属性可以提供view翻转或缩放的动画效果,默认为nil
@property(nullable, copy) NSString *keyPath;:表示可以进行动画的属性(从官方文档这里可以查到

1. CABasicAnimation 基础动画

You create an instance of CABasicAnimation using the inherited animationWithKeyPath: method, specifying the key path of the property to be animated in the render tree.

使用animationWithKeyPath:方法创建CABasicAnimation的实例,需要指定具体的keyPath来决定哪个属性来实现动画效果。
CABasicAnimation只新增了三个属性:
fromValuetoValuebyValue,这三个属性的使用也是real interesting:

  • 如果fromValuetoValue同时都不为nil,动画效果是从fromValue变化到toValue
  • fromValuebyValue不为nil,动画效果是从fromValuefromValue+byValue
  • byValuetoValue不为nil,动画效果从fromValue-byValuetoValue
  • 只有fromValue不为nil,动画效果从fromValue到当前状态
  • 只有toValue不为nil,动画效果从当状态变化到toValue
  • 只有byValue不为nil,动画效果从当前值变化到当前值+byValue
1.1 CASpringAnimation弹性动画

继承自CABasicAnimation
弹性动画的几个属性(iOS9以后可用):
@property CGFloat mass;:附着在弹簧末端的质量,必须是大于0的数值,默认为1
@property CGFloat stiffness;:弹簧的硬度,值越大弹簧产生的力度越大。值必须大于0,默认是100
@property CGFloat damping;:阻力系数,值越大弹簧就越快停止。值必须大于等于0,默认值为10
@property CGFloat initialVelocity;:弹簧的初始速率,默认值是0,表示该物品没有被移动。如果该值为正,速度方向和运动方向一致,如果为负,速度方向和运动方向相反
@property(readonly) CFTimeInterval settlingDuration;:结算时间,是只读参数,根据当前设置的参数估算的动画时长

CASpringAnimation动画比较好玩,可惜只能iOS9+才能使用,小于该版本的只能自定义了
如图是用springAnimation作的效果:


springAnimation.gif

代码:

CASpringAnimation *springAnim = [CASpringAnimation animationWithKeyPath:@"position.y"];
    springAnim.initialVelocity = 3;
    springAnim.stiffness = 110;
    springAnim.mass = 1;
    springAnim.damping = 5;
    springAnim.fromValue = @(self.basicView.y);
    springAnim.toValue = @(self.basicView.y + 150);
    springAnim.duration = springAnim.settlingDuration;
    springAnim.removedOnCompletion = NO;
    springAnim.fillMode = kCAFillModeForwards;
    [self.basicView.layer addAnimation:springAnim forKey:@"springAnimation"];
2. CAKeyframAnimation 关键帧动画

继承自CAPropertyAnimation
属性:
@property(nullable, copy) NSArray *values;:存放每个关键帧的数组
@property(nullable) CGPathRef path;:关键帧路径,当它是非空时,会覆盖values。默认是nil
@property(nullable, copy) NSArray<NSNumber *> *keyTimes;:该数组定义了和values对应的每一帧的时间,每个值的取值范围是[0,1],如果不设置表示每一帧的时间都相同
@property(nullable, copy) NSArray<CAMediaTimingFunction *> *timingFunctions;:时间曲线函数,如果values中定义了n个关键帧对象,则该属性内应定义n-1个对应的对象
@property(copy) NSString *calculationMode;:顾名思义啦,就是计算模式,列举如下:
kCAAnimationLinear:各关键帧坐标点直线连接,是默认值
kCAAnimationDiscrete:分离式的,没有补间动画
kCAAnimationPaced:平均,如果使用此值,则keyTimetimeFunction被忽略
kCAAnimationCubic:对关键帧的坐标点进行圆滑曲线连接后插值计算
kCAAnimationCubicPaced:在kCAAnimationCubic的基础上使动画变得均匀,同样地,使用该值之后,keyTimetimeFunction会被忽略

@property(nullable, copy) NSArray<NSNumber *> *tensionValues;
@property(nullable, copy) NSArray<NSNumber *> *continuityValues;
@property(nullable, copy) NSArray<NSNumber *> *biasValues;

对于计算模式是立方模式(cubic)的,这些属性可以提供对插值方案的控制。每个关键帧都可能有与之关联的张力(tensionValues)、连续性(continuityValues)和偏差值(biasValues),这几个属性的取值范围是[-1,1]
@property(nullable, copy) NSString *rotationMode;:旋转模式,可取的值为:
kCAAnimationRotateAuto:自动旋转
kCAAnimationRotateAutoReverse:自动翻转

CATransitionAnimation 转场动画

继承自CAAnimation
惯例看一下它的属性:

@property(copy) NSString *type;:转场的名称,默认是fade,以下是可用值:
kCATransitionFade
kCATransitionMoveIn
kCATransitionPush
kCATransitionReveal
除了这几种,还可以使用系统私有的动画效果:
@"cube":立方体翻转效果
@"oglFlip":翻转效果
@"suckEffect":收缩效果,动画方向不可控
@"rippleEffecct":水滴波纹效果,动画方向不可控
@"pageCurl":向上翻页效果
@"pageunCurl":向下翻页效果
@"cameraIrisHollowOpen":摄像头打开效果,动画方向不可控
@"cameraIrisHollowClose":摄像头关闭效果,动画方向不可控

@property(nullable, copy) NSString *subtype;:可选类型,用于指定转场的方向,可用值如下:
kCATransitionFromRight:一目了然,不解释啦
kCATransitionFromLeft
kCATransitionFromTop
kCATransitionFromBottom

@property float startProgress;:开始进度,默认是0,表示动画从头开始。比如,设置成0.5,那么动画就从一半的地方开始执行
@property float endProgress;:结束进度,默认是1.比如设置成0.5,那么动画就从头开始,进行到0.5处停止

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

推荐阅读更多精彩内容