1、CALayer简介

CALayer是个与UIView很类似的概念,同样有backgroundColor、frame等相似的属性,我们可以将UIView看做一种特殊的CALayer。但实际上UIView是对CALayer封装,在CALayer的基础上再添加交互功能。UIView的显示必须依赖于CALayer。
我们同样可以跟新建view一样新建一个layer,然后添加到某个已有的layer上,同样可以对layer调整大小、位置、透明度等。
一般来说,layer可以有两种用途:一是对view相关属性的设置,包括圆角、阴影、边框等参数;二是实现对view的动画操控。因此对一个view进行动画,本质上是对该view的.layer进行动画操纵。

2.CAAnimation的分类

(1) CABasicAnimation

基础动画,通过设定起始点,终点,时间,动画会沿着你这设定点进行移动。可以看做特殊的CAKeyFrameAnimation

(2) CAKeyframeAnimation
关键帧动画

(3) CAAnimationGroup
组动画,支持多个CABasicAnimation或者CAKeyframeAnimation动画同时执行

基本动画代码:

    /**创建CALayer*/
CALayer * testLayer = [[CALayer alloc] init];
testLayer.backgroundColor = [UIColor greenColor].CGColor;
testLayer.frame = CGRectMake(, , , );
testLayer.cornerRadius = ;
[self.view.layer addSublayer:testLayer];
/**创建动画*/
CABasicAnimation * testAnimiation = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
testAnimiation.fromValue = [NSNumber numberWithFloat:1.0];
testAnimiation.toValue = [NSNumber numberWithFloat:1.5];
testAnimiation.autoreverses = YES;
testAnimiation.fillMode = kCAFillModeBackwards;
testAnimiation.removedOnCompletion = NO;
testAnimiation.repeatCount = MAXFLOAT;
testAnimiation.duration = ;
[testLayer addAnimation:testAnimiation forKey:@"testAnimiation"];

参数解释:

1.animationWithKeyPath的值如下:

anchorPoint 
backgroundColor 
backgroundFilters 
borderColor 
borderWidth 
bounds 
compositingFilter 
contents 
contentsRect 
cornerRadius 
doubleSided 
filters 
frame :This property is not animatable. You can achieve the same results by animating theboundsandpositionproperties. 
hidden 
mask 
masksToBounds 
opacity 
position 
shadowColor 
shadowOffset 
shadowOpacity 
shadowPath 
shadowRadius 
sublayers 
sublayerTransform 
transform 翻转包含scale rotation 
zPosition

大部分我们常用的是:

transform.scale = 比例缩放动画 
transform.scale.x = 宽的比例动画 
transform.scale.y = 高的比例动画 
transform.rotation.z = 平面的旋转 
opacity = 透明度

2.fromValue: 动画的起始状态值,虽然iOS文档给出的类型是id,不过这里应该传NSValue对象,比如NSNumber(NSNubmer继承自NSValue)。其具体含义

3.autoreverse: 当动画执行到toValue指定的状态时是从toValue的状态逆回去,还是直接跳到fromValue的状态再执行一遍

4.fileMode: fillMode的作用就是决定当前对象过了非active时间段的行为. 非active时间段是指动画开始之前以及动画结束之后。如果是一个动画CAAnimation,则需要将其removedOnCompletion设置为NO,要不然fillMode不起作用. 下面来讲各个fillMode的意义:

kCAFillModeRemoved 这个是默认值,也就是说当动画开始前和动画结束后,动画对layer都没有影响,动画结束后,layer会恢复到之前的状态

kCAFillModeForwards 当动画结束后,layer会一直保持着动画最后的状态

kCAFillModeBackwards 这个和kCAFillModeForwards是相对的,就是在动画开始前,你只要将动画加入了一个layer,layer便立即进入动画的初始状态。因为有可能出现fromValue不是目前layer的初始状态的情况,如果fromValue就是layer当前的状态,则这个参数就没太大意义。

kCAFillModeBoth 理解了上面两个,这个就很好理解了,这个其实就是上面两个的合成.动画加入后开始之前,layer便处于动画初始状态,动画结束后layer保持动画最后的状态.

CAAnimationGroup实现动画

 /**创建CALayer*/
// CALayer * testLayer = [[CALayer alloc] init];
// testLayer.backgroundColor = [UIColor greenColor].CGColor;
// testLayer.frame = CGRectMake(100, 100, 100, 100);
// testLayer.cornerRadius = 10;
// [self.view.layer addSublayer:testLayer];
UILabel * label = [[UILabel alloc] initWithFrame:CGRectMake(, , , )];
label.backgroundColor = [UIColor greenColor];
[self.view addSubview:label];
/**创建动画*/
/**缩放*/
CABasicAnimation * testAnimiation = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
testAnimiation.fromValue = [NSNumber numberWithFloat:1.0];
testAnimiation.toValue = [NSNumber numberWithFloat:1.5];
testAnimiation.autoreverses = YES;
testAnimiation.fillMode = kCAFillModeBackwards;
testAnimiation.removedOnCompletion = NO;
testAnimiation.repeatCount = MAXFLOAT;
testAnimiation.duration = ;
// [label.layer addAnimation:testAnimiation forKey:@"testAnimiation"];
/**移动*/
CABasicAnimation *moveAnimation = [CABasicAnimation animationWithKeyPath:@"position"];
moveAnimation.fromValue = [NSValue valueWithCGPoint:label.layer.position];
moveAnimation.toValue = [NSValue valueWithCGPoint:CGPointMake( - , label.layer.position.y)];
moveAnimation.autoreverses = YES;
moveAnimation.repeatCount = MAXFLOAT;
moveAnimation.duration = ;
/**旋转*/
CABasicAnimation *rotateAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.x"];
rotateAnimation.fromValue = [NSNumber numberWithFloat:0.0];
rotateAnimation.toValue = [NSNumber numberWithFloat:6.0 * M_PI];
rotateAnimation.autoreverses = YES;
rotateAnimation.repeatCount = MAXFLOAT;
rotateAnimation.duration = ;
/**动画组合*/
CAAnimationGroup *groupAnnimation = [CAAnimationGroup animation];
groupAnnimation.duration = ;
groupAnnimation.autoreverses = YES;
groupAnnimation.animations = @[moveAnimation, testAnimiation, rotateAnimation];
groupAnnimation.repeatCount = MAXFLOAT; [label.layer addAnimation:groupAnnimation forKey:@"groupAnnimation"];

iOS开发CABasicAnimation动画理解的更多相关文章

  1. iOS开发之动画编程的几种方法

    iOS开发之动画编程的几种方法 IOS中的动画总结来说有五种:UIView<block>,CAAnimation<CABasicAnimation,CATransition,CAKe ...

  2. iOS 开发之动画篇 - 从 UIView 动画说起

    毋庸置疑的:在iOS开发中,制作动画效果是最让开发者享受的环节之一.一个设计严谨.精细的动画效果能给用户耳目一新的效果,吸引他们的眼光 —— 这对于app而言是非常重要的. 本文作为动画文集的第一篇, ...

  3. iOS开发之动画中的时间(概况)

    一.引言 在iOS开发中使用动画时,可以通过设置动画的duration.speed.begintime.offset属性,来设置动画的时长.速度.起始时间及起始偏移. 用一个简单的例子来说明各个参数的 ...

  4. iOS开发:深入理解GCD 第二篇(dispatch_group、dispatch_barrier、基于线程安全的多读单写)

    Dispatch Group在追加到Dispatch Queue中的多个任务处理完毕之后想执行结束处理,这种需求会经常出现.如果只是使用一个Serial Dispatch Queue(串行队列)时,只 ...

  5. iOS开发:深入理解GCD 第一篇

    最近把其他书籍都放下了,主要是在研究GCD.如果是为了工作,以我以前所学的GCD.NSOperation等知识已经足够用了,但学习并不仅仅知识满足于用它,要知其然.并且知其所以然,这样才可以不断的提高 ...

  6. iOS 开发:深入理解 Xcode 工程结构(一)转

    当我们新建一个 Cocoa 项目时,Xcode 会提供一系列的模板,类似前端的脚手架工具,只需要简单的几个选项,就可以配置好一个项目所需的基本环境. 这些基本环境配置一般包括: 编译选项.证书链选项 ...

  7. IOS开发-属性动画和关键帧动画的使用

    CAMediaTiming是一个协议(protocol),CAAnimation是所有动画类的父类,但是它不能直接使用,应该使用它的子类. 继承关系: CoreAnmiation 核心动画 简写CA ...

  8. iOS开发-动画总结

    一.简介 IOS 动画主要是指Core Animation框架.官方使用文档地址为:Core Animation Guide.Core Animation是IOS和OS X平台上负责图形渲染与动画的基 ...

  9. iOS开发之动画中的时间

    概述 在动画中,我们会指定动画的持续时间.例如 scaleAnimation.duration = self.config.appearDuration 那么这个时间是怎么定义的呢?是指的绝对时间吗? ...

随机推荐

  1. Python学习 :常用模块(一)

    常用模块(一) 一.时间(time)模块 时间戳 (Timestamp):时间戳表示的是从1970年1月1日00:00:00为计时起点,到当前的时间长度 import time print(help( ...

  2. 『Linux基础 - 4 』linux常用命令(1)

    这篇笔记包含以下知识点: 几个概念的理解:Linux命令,控制台,终端, 终端提示符 对文件目录的操作的相关命令: 切换目录,列出目录下的文件等 对文件的操作的相关命令: 创建,删除,复制,修改,移动 ...

  3. 第4天 Java基础语法

    第4天 Java基础语法 今日内容介绍 流程控制语句(switch) 数组 流程控制语句 选择结构switch switch 条件语句也是一种很常用的选择语句,它和if条件语句不同,它只能针对某个表达 ...

  4. 利用谷歌翻译网站和Adobe Acrobat翻译英文文档,且鼠标放置后显示英文原文(无字数限制)(18/12/11更新)

    软件:Adobe Acrobat 网页:https://translate.google.cn/?tr=f&hl=zh-CN 方法:       第一步:用Adobe Acrobat 打开英文 ...

  5. malloc、calloc、realloc函数说明

    malloc 函数 #include <stdlib.h> void* malloc(int n); n为要分配的字节数,如果成功,返回获得空间的首地址,如果分配失败,则返回NULL,ma ...

  6. 20145207《网络对抗》MAL后门原理与实践

    20145207<网络对抗>MAL后门原理与实践 基础问题回答 (1)例举一个后门进入到你系统中的可能方式? 下载软件,淘宝虚假链接,买卖账号时侵入的黑客 (2)例举一个后门启动起来(wi ...

  7. python中利用少量代码快速实现从类对象中抽取所需属性的一种实践

    项目中有可能会碰到这样一种场景: 根据一个id,查询得到和id对应的完整数据信息存储对象,比如书籍id到书籍详细信息,用户id到用户详细信息等,详细信息字段可能包括几十甚至上百个数据字段,真正需要返回 ...

  8. Bing wallpaper api

    list: http://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1&mkt=zh-cn idx:-1为明天,1为 ...

  9. react-native android 初始化问题

    最近开始接触rn,官方起手,装了一堆工具,然后启动项目的时候出现了一堆问题,这里针对我遇到的一些问题提供一些解决方案. 本人开发环境mac,在启动ios的时候没啥大问题,可以直接启动,这里提示一点,因 ...

  10. 如何用istio实现应用的灰度发布

    Istio为用户提供基于微服务的流量治理能力.Istio允许用户按照标准制定一套流量分发规则,并且无侵入的下发到实例中,平滑稳定的实现灰度发布功能. 基于华为云的Istio服务网格技术,使得灰度发布全 ...