iOS开发CABasicAnimation动画理解
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动画理解的更多相关文章
- iOS开发之动画编程的几种方法
iOS开发之动画编程的几种方法 IOS中的动画总结来说有五种:UIView<block>,CAAnimation<CABasicAnimation,CATransition,CAKe ...
- iOS 开发之动画篇 - 从 UIView 动画说起
毋庸置疑的:在iOS开发中,制作动画效果是最让开发者享受的环节之一.一个设计严谨.精细的动画效果能给用户耳目一新的效果,吸引他们的眼光 —— 这对于app而言是非常重要的. 本文作为动画文集的第一篇, ...
- iOS开发之动画中的时间(概况)
一.引言 在iOS开发中使用动画时,可以通过设置动画的duration.speed.begintime.offset属性,来设置动画的时长.速度.起始时间及起始偏移. 用一个简单的例子来说明各个参数的 ...
- iOS开发:深入理解GCD 第二篇(dispatch_group、dispatch_barrier、基于线程安全的多读单写)
Dispatch Group在追加到Dispatch Queue中的多个任务处理完毕之后想执行结束处理,这种需求会经常出现.如果只是使用一个Serial Dispatch Queue(串行队列)时,只 ...
- iOS开发:深入理解GCD 第一篇
最近把其他书籍都放下了,主要是在研究GCD.如果是为了工作,以我以前所学的GCD.NSOperation等知识已经足够用了,但学习并不仅仅知识满足于用它,要知其然.并且知其所以然,这样才可以不断的提高 ...
- iOS 开发:深入理解 Xcode 工程结构(一)转
当我们新建一个 Cocoa 项目时,Xcode 会提供一系列的模板,类似前端的脚手架工具,只需要简单的几个选项,就可以配置好一个项目所需的基本环境. 这些基本环境配置一般包括: 编译选项.证书链选项 ...
- IOS开发-属性动画和关键帧动画的使用
CAMediaTiming是一个协议(protocol),CAAnimation是所有动画类的父类,但是它不能直接使用,应该使用它的子类. 继承关系: CoreAnmiation 核心动画 简写CA ...
- iOS开发-动画总结
一.简介 IOS 动画主要是指Core Animation框架.官方使用文档地址为:Core Animation Guide.Core Animation是IOS和OS X平台上负责图形渲染与动画的基 ...
- iOS开发之动画中的时间
概述 在动画中,我们会指定动画的持续时间.例如 scaleAnimation.duration = self.config.appearDuration 那么这个时间是怎么定义的呢?是指的绝对时间吗? ...
随机推荐
- FMX有一套自己的消息处理机制。类似这样:
unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Var ...
- 利用haohedi ETL将数据库中的数据抽取到hadoop Hive中
采用HIVE自带的apache 的JDBC驱动导入数据基本上只能采用Load data命令将文本文件导入,采用INSERT ... VALUES的方式插入速度极其慢,插入一条需要几十秒钟,基本上不可用 ...
- linux进程篇 (三) 进程间的通信3 IPC通信
3 IPC通信 用户空间 进程A <----无法通信----> 进程B -----------------|--------------------------------------|- ...
- BAPC 2014 Preliminary
// 题目链接: https://nanti.jisuanke.com/t/282041 //动态规划,重复利用子问题的最优,来求解当前最优问题 #include <iostream> # ...
- swig与python
当你觉得python慢的时候,当你的c/c++代码难以用在python上的时候,你可能会注意这篇文章.swig是一个可以把c/c++代码封装为python库的工具.(本文封装为python3的库) 文 ...
- 洛谷P4136 谁能赢呢?
题目描述 小明和小红经常玩一个博弈游戏.给定一个n×n的棋盘,一个石头被放在棋盘的左上角.他们轮流移动石头.每一回合,选手只能把石头向上,下,左,右四个方向移动一格,并且要求移动到的格子之前不能被访问 ...
- React-精华版
现在最热门的前端框架有AngularJS.React.Bootstrap等.自从接触了ReactJS,ReactJs的虚拟DOM(Virtual DOM)和组件化的开发深深的吸引了我,下面来跟我一起领 ...
- nodeJs 安装 npm nodeModules package.json
Nodejs 1.安装nodejs 从nodejs官网下载最新版本的node,设置环境变量这样就可以在cmd下直接用命令行操作npm 环境变量:path d:/nodejs 查看本机node及n ...
- Ruby 基础教程1-9
异常 1.异常结构 [ begin] ... rescue [retry] ... [ensure] . ...
- python 函数定义顺序
#!/usr/bin/python # Hello World def order(): print("haha") print('Hello World!') order()