iOS基本动画
来源:互联网 发布:更新mac系统版本出错 编辑:程序博客网 时间:2024/05/20 02:21
iOS 核心动画介绍:
CAAnimation:核心动画的基础类,不能直接使用,负责动画运行时间、速度的控制,本身实现了CAMediaTiming协议。
CAPropertyAnimation:属性动画的基类(通过属性进行动画设置,注意是可动画属性),不能直接使用。
CAAnimationGroup:动画组,动画组是一种组合模式设计,可以通过动画组来进行所有动画行为的统一控制,组中所有动画效果可以并发执行。
CATransition:转场动画,主要通过滤镜进行动画效果设置。
CAKeyframeAnimation:关键帧动画,同样是通过属性进行动画参数控制,但是同基础动画不同的是它可以有多个状态控制。
CABasicAnimation:基础动画,通过属性修改进行动画参数控制,只有初始状态和结束状态。
CASpringAnimation : 弹簧动画 ,继承自CABasicAnimation。用于模拟弹簧的各种动画。
一、简单介绍
CAPropertyAnimation的子类
属性解析:
fromValue:keyPath相应属性的初始值
toValue:keyPath相应属性的结束值
随着动画的进行,在长度为duration的持续时间内,keyPath相应属性的值从fromValue渐渐地变为toValue
如果fillMode=kCAFillModeForwards和removedOnComletion=NO,那么在动画执行完毕后,图层会保持显示动画执行后的状态。但在实质上,图层的属性值还是动画执行前的初始值,并没有真正被改变。
比如,CALayer的position初始值为(0,0),CABasicAnimation的fromValue为(10,10),toValue 为(100,100),虽然动画执行完毕后图层保持在(100,100)这个位置,实质上图层的position还是为(0,0)
@interface ViewController ()@property (nonatomic, strong) CALayer *myLayer;@end@implementation ViewController- (void)viewDidLoad { [super viewDidLoad]; /** * 动画 属性 配置 */ [self animationSetup]; }/** * 动画 属性 配置 */- (void)animationSetup { //创建layer 动画渲染 对象 CALayer *myLayer = [CALayer layer]; //设置layer的属性 myLayer.bounds = CGRectMake(0, 0, 50, 80); myLayer.backgroundColor = [UIColor yellowColor].CGColor; //CALayer 对象的 左上角的位置坐标 myLayer.position = CGPointMake(50, 50); myLayer.anchorPoint = CGPointMake(0.5, 0.5); myLayer.cornerRadius = 20; //添加layer [self.view.layer addSublayer:myLayer]; self.myLayer = myLayer; }
/* 彻底理解position与anchorPoint :
1、 anchorPoint:
一般都是先介绍position,再介绍anchorPoint。我这里反过来,先来说说anchorPoint。
从一个例子开始入手吧,想象一下,把一张A4白纸用图钉订在书桌上,如果订得不是很紧的话,白纸就可以沿顺时针或逆时针方向围绕图钉旋转,这时候图钉就起着支点的作用。我们要解释的anchorPoint就相当于白纸上的图钉,它主要的作用就是用来作为变换的支点,旋转就是一种变换,类似的还有平移、缩放。
继续扩展,很明显,白纸的旋转形态随图钉的位置不同而不同,图钉订在白纸的正中间与左上角时分别造就了两种旋转形态,这是由图钉(anchorPoint)的位置决定的。如何衡量图钉(anchorPoint)在白纸中的位置呢?在iOS中,anchorPoint点的值是用一种相对bounds的比例值来确定的,在白纸的左上角、右下角,anchorPoint分为为(0,0), (1, 1),也就是说anchorPoint是在单元坐标空间(同时也是左手坐标系)中定义的。类似地,可以得出在白纸的中心点、左下角和右上角的anchorPoint为(0.5,0.5), (0,1), (1,0)。
像UIView有superView与subView的概念一样,CALayer也有superLayer与layer的概念,前面说到的白纸和图中的矩形可以理解为layer,书桌和图中矩形以外的坐标系可以理解成superLayer。如果各自以左上角为原点,则在图中有相对的两个坐标空间。
2、 position:
这时候可以大胆猜测一下,position是不是就是anchorPoint在superLayer中的位置呢?答案是确定的,更确切地说,position是layer中的anchorPoint点在superLayer中的位置坐标。因此可以说, position点是相对suerLayer的,anchorPoint点是相对layer的,两者是相对不同的坐标空间的一个重合点。
*/
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { //平移 动画// [self translation]; //平移补充 //[self supplementTranslation]; //缩放动画 //[self zoom]; //旋转 动画 [self rotation]; }/** * 平移 动画 */- (void)translation { //1.创建基础动画 //CABasicAnimation *anima=[CABasicAnimation animationWithKeyPath:<#(NSString *)#>] CABasicAnimation *anima = [CABasicAnimation animation]; //1.1告诉系统要执行什么样的动画 anima.keyPath = @"position"; //设置通过动画,将layer从哪儿移动到哪儿 anima.fromValue = [NSValue valueWithCGPoint:CGPointMake(0, 0)]; anima.toValue = [NSValue valueWithCGPoint:CGPointMake(200, 300)]; //1.2设置动画执行完毕之后不删除 anima.removedOnCompletion = NO; //1.3设置保存动画的最新状态 anima.fillMode = kCAFillModeForwards; //removedOnCompletion、fillMode为了保持动画执行后的状态,否则动画自动移除 返回的最初的状态 //设置代理:设置动画的代理,可以监听动画的执行过程,这里设置控制器为代理。 anima.delegate = self; NSString *str=NSStringFromCGPoint(self.myLayer.position); NSLog(@"执行前:%@",str); //2.添加核心动画到layer [self.myLayer addAnimation:anima forKey:nil]; }- (void)animationDidStart:(CAAnimation *)anim { NSLog(@"开始执行动画");}- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag { NSString *str = NSStringFromCGPoint(self.myLayer.position); NSLog(@"执行后:%@",str);}/** * 平移补充 */- (void)supplementTranslation { //1.创建动画 CABasicAnimation *anima = [CABasicAnimation animation]; anima.keyPath = @"transform"; //1.1设置动画执行时间 anima.duration = 2.0; //1.2修改属性,执行动画 anima.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeTranslation(100, 100, 100)]; //1.3设置动画执行完毕后不删除动画 anima.removedOnCompletion = NO; //1.4设置保存动画的最新状态 anima.fillMode = kCAFillModeForwards; //2.添加动画到layer [self.myLayer addAnimation:anima forKey:nil]; }/** * 缩放 动画 */- (void)zoom { //1.创建动画 CABasicAnimation *anima = [CABasicAnimation animationWithKeyPath:@"bounds"]; //1.1设置动画执行时间 anima.duration = 2.0; //1.2设置动画执行完毕不删除动画 anima.removedOnCompletion = NO; //1.3设置保存动画的最新状态 anima.fillMode = kCAFillModeForwards; //1.4修改属性,执行动画 anima.toValue = [NSValue valueWithCGRect:CGRectMake(0, 0, 200, 200)]; //2.添加动画到layer [self.myLayer addAnimation:anima forKey:nil]; }/** * 旋转 动画 */- (void)rotation { //1.创建动画 CABasicAnimation *anima = [CABasicAnimation animationWithKeyPath:@"transform"]; //1.1设置动画执行的时间 anima.duration = 2.0; //1.2修改属性,执行动画 anima.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI_2 + M_PI_4, 0, 0, 1)]; //1.3设置动画执行完成完毕后不删除动画 anima.removedOnCompletion = NO; //1.4设置保存动画的最新状态// anima.fillMode = kCAFillModeForwards; //2.添加动画到layer [self.myLayer addAnimation:anima forKey:nil]; }
CASpringAnimation 模拟弹簧动画
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib.[self.label.layer removeAnimationForKey:@"position.x"]; CASpringAnimation *spring = [[CASpringAnimation alloc] init]; spring.keyPath = @"position.x"; //质量,影响图层运动时的弹簧惯性,质量越大,弹簧拉伸和压缩的幅度越大 spring.mass = 1; //刚度系数(劲度系数/弹性系数),刚度系数越大,形变产生的力就越大,运动越快 spring.stiffness = 100; //阻尼系数,阻止弹簧伸缩的系数,阻尼系数越大,停止越快 spring.damping = 5; //初始速率,动画视图的初始速度大小 spring.initialVelocity = 0; //结算时间 返回弹簧动画到停止时的估算时间,根据当前的动画参数估算 NSValue *fromValue = [NSValue valueWithCGPoint:CGPointMake(self.label.layer.position.x, self.label.layer.position.y)]; spring.fromValue = fromValue; NSValue *toValue = [NSValue valueWithCGPoint:CGPointMake(self.label.layer.position.x + 60, self.label.layer.position.y)]; spring.toValue = toValue; spring.duration = spring.settlingDuration; [self.label.layer addAnimation:spring forKey:spring.keyPath];}
- IOS 基本 动画
- iOS基本动画
- iOS:核心动画之基本动画CABasicAnimation
- IOS之 基本动画原理
- ios 动画的基本使用
- ios 三种基本动画
- IOS之 基本动画原理
- iOS核心动画基本要点
- IOS之CAAnimation基本动画
- IOS基本动画效果和实现
- iOS - 绘图,基本动画,关键帧动画,常用图层
- iOS动画 基本动画操作和长按控件抖动
- ios动画中抖动动画效果的实现与CALayer动画的基本理解
- 基本动画
- 动画基本
- 基本动画
- [ios开发基础知识之]界面常用基本动画
- IOS UI动画与手势的基本使用
- 视觉SLAM漫谈(二):图优化理论与g2o的使用
- 深入Java集合学习系列:HashMap的实现原理
- Data Structure
- Vim 的 Python 编辑器详细配置过程 (Based on Ubuntu 12.04 LTS)
- 发布自己的库到Cocoapods上, Pods install 自己的库
- iOS基本动画
- 海潮负荷模型ES2012
- android学习——activity生命周期和切换逻辑
- java中变量的几种名称fileds,parameters,arguments
- jquery实现全选和反选
- UVA 1515 (最小割)
- 299. Bulls and Cows
- HDOJ 3788 ZOJ问题
- Leetcode:228. Summary Ranges(JAVA)