博主:最近iOS开发中用到CoreAnimation的framework来做动画效果,虽然以前也用过,但一直没有系统学习过,今天看到一篇非常详细的博文(虽然是日语,但真的写的很好),在此翻译出来供大家学习。

原帖地址:http://www.objectivec-iphone.com/animation/CoreAnimation/CABasicAnimation.html

本文为博主翻译,若需转载,请注明出处:http://blog.csdn.net/iosevanhuang/article/details/14488239

CABasicAnimation类的使用方式就是基本的关键帧动画。

所谓关键帧动画,就是将Layer的属性作为KeyPath来注册,指定动画的起始帧和结束帧,然后自动计算和实现中间的过渡动画的一种动画方式。

CABasicAnimation的基本使用顺序

1.引用QuartzCore.framework

将"QuartzCore.framework"这个库添加到项目中。并且在需要使用CABaseAnimation类的地方import头文件。

[objc] view plain copy

  1. #import <QuartzCore/QuartzCore.h>

2.CABaseAnimation的实例化以及关键路径的注册

使用"animationWithKeyPath:"方法进行CABasicAnimation的实例化,并指定Layer的属性作为关键路径来注册。

[objc] view plain copy

  1. // 指定position属性
  2. CABasicAnimation *animation =
  3. [CABasicAnimation animationWithKeyPath:@"position"];

3.设定动画

设定动画的属性。以下是属性及其对应的说明:

属性 说明
duration 动画时长(秒为单位)(注:此处与原文有出入)
repeatCount 重复次数。永久重复的话设置为HUGE_VALF。
beginTime 指定动画开始时间。从开始指定延迟几秒执行的话,请设置为
「CACurrentMediaTime() + 秒数」的形式。
timingFunction 设定动画的速度变化
autoreverses 动画结束时是否执行逆动画

例:

[objc] view plain copy

  1. animation.duration = 2.5; // 动画持续时间
  2. animation.repeatCount = 1; // 不重复
  3. animation.beginTime = CACurrentMediaTime() + 2; // 2秒后执行
  4. animation.autoreverses = YES; // 结束后执行逆动画
  5. // 动画先加速后减速
  6. animation.timingFunction =
  7. [CAMediaTimingFunction functionWithName: kCAMediaTimingFunctionEaseInEaseOut];

4.设定动画的开始帧和结束帧

设定动画开始和结束帧时的状态。设定的值会变为KeyPath所指定的属性的值。

属性 说明
fromValue 开始值
toValue 终了值(絶対値)
byValue 终了值(相对值)

例:

[objc] view plain copy

  1. // 指定position属性(移动)
  2. CABasicAnimation *animation =
  3. [CABasicAnimation animationWithKeyPath:@"position"];
  4. ・・・
  5. // 设定动画起始帧和结束帧
  6. animation.fromValue = [NSValue valueWithCGPoint:CGPointMake(0, 0)]; // 起始点
  7. animation.toValue = [NSValue valueWithCGPoint:CGPointMake(320, 480)]; // 终了点

5.添加动画

为Layer添加设置完成的动画,可以给Key指定任意名字。

[objc] view plain copy

  1. [myView.layer addAnimation:animation forKey:@"move-layer"];

其他.动画结束后回到初始状态的现象的解决方法

用CABasicAnimation执行动画,在动画结束后会回归动画开始前的状态。想要解决的话,必须设置“removedOnCompletion”和“fillMode”这两个属性。

[objc] view plain copy

  1. // 动画终了后不返回初始状态
  2. animation.removedOnCompletion = NO;
  3. animation.fillMode = kCAFillModeForwards;

CABasicAnimation的使用示例

实际上CABasicAnimation有很多种使用方法,以下将一一列举。

移动动画

移动动画的代码如下:

[objc] view plain copy

  1. /* 移动 */
  2. CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"];
  3. // 动画选项的设定
  4. animation.duration = 2.5; // 持续时间
  5. animation.repeatCount = 1; // 重复次数
  6. // 起始帧和终了帧的设定
  7. animation.fromValue = [NSValue valueWithCGPoint:myView.layer.position]; // 起始帧
  8. animation.toValue = [NSValue valueWithCGPoint:CGPointMake(320, 480)]; // 终了帧
  9. // 添加动画
  10. [myView.layer addAnimation:animation forKey:@"move-layer"];

旋转动画

旋转动画的代码如下:

[objc] view plain copy

  1. /* 旋转 */
  2. // 对Y轴进行旋转(指定Z轴的话,就和UIView的动画一样绕中心旋转)
  3. CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.y"];
  4. // 设定动画选项
  5. animation.duration = 2.5; // 持续时间
  6. animation.repeatCount = 1; // 重复次数
  7. // 设定旋转角度
  8. animation.fromValue = [NSNumber numberWithFloat:0.0]; // 起始角度
  9. animation.toValue = [NSNumber numberWithFloat:22 * M_PI]; // 终止角度
  10. // 添加动画
  11. [myView.layer addAnimation:animation forKey:@"rotate-layer"];

缩放动画

缩放动画的代码如下:

[objc] view plain copy

  1. /* 放大缩小 */
  2. // 设定为缩放
  3. CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
  4. // 动画选项设定
  5. animation.duration = 2.5; // 动画持续时间
  6. animation.repeatCount = 1; // 重复次数
  7. animation.autoreverses = YES; // 动画结束时执行逆动画
  8. // 缩放倍数
  9. animation.fromValue = [NSNumber numberWithFloat:1.0]; // 开始时的倍率
  10. animation.toValue = [NSNumber numberWithFloat:2.0]; // 结束时的倍率
  11. // 添加动画
  12. [myView.layer addAnimation:animation forKey:@"scale-layer"];

组合动画

使用CAAnimationGroup类进行复数动画的组合。代码如下:

[objc] view plain copy

  1. /* 动画1(在X轴方向移动) */
  2. CABasicAnimation *animation1 =
  3. [CABasicAnimation animationWithKeyPath:@"transform.translation.x"];
  4. // 终点设定
  5. animation1.toValue = [NSNumber numberWithFloat:80];; // 終点
  6. /* 动画2(绕Z轴中心旋转) */
  7. CABasicAnimation *animation2 =
  8. [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
  9. // 设定旋转角度
  10. animation2.fromValue = [NSNumber numberWithFloat:0.0]; // 开始时的角度
  11. animation2.toValue = [NSNumber numberWithFloat:44 * M_PI]; // 结束时的角度
  12. /* 动画组 */
  13. CAAnimationGroup *group = [CAAnimationGroup animation];
  14. // 动画选项设定
  15. group.duration = 3.0;
  16. group.repeatCount = 1;
  17. // 添加动画
  18. group.animations = [NSArray arrayWithObjects:animation1, animation2, nil nil];
  19. [myView.layer addAnimation:group forKey:@"move-rotate-layer"];

捕获动画开始时和终了时的事件

博主:设定委托对象,实现委托方法,如下:

[objc] view plain copy

  1. /* 移动 */
  2. CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.translation.y"];
  3. animation.delegate = self; // 指定委托对象
  4. // 设定动画选项
  5. animation.duration = 2.5; // 动画时长
  6. animation.repeatCount = 1; // 重复次数
  7. // 终点设定
  8. animation.toValue = [NSNumber numberWithFloat:100];; // 终点
  9. // 添加动画
  10. [myView.layer addAnimation:animation forKey:@"move-layer"];
  11. ・・・
  12. /**
  13. * 动画开始时
  14. */
  15. - (void)animationDidStart:(CAAnimation *)theAnimation
  16. {
  17. NSLog(@"begin");
  18. }
  19. /**
  20. * 动画结束时
  21. */
  22. - (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag
  23. {
  24. NSLog(@"end");
  25. }

CABasicAnimation使用时候的注意点

CABasicAnimation正在进行动画的时候,点击了Home按钮后再回到app的时候,动画会被清空。

Objective-C的示例程序

使用CABasicAnimation实现关键帧动画的示例程序如下:

[objc] view plain copy

  1. - (void)viewDidLoad
  2. {
  3. [super viewDidLoad];
  4. // 图像显示
  5. UIImage *image = [UIImage imageNamed:@"image01.png"];
  6. UIImageView *imageView = [[UIImageView alloc]initWithImage:image];
  7. imageView.center = CGPointMake(160, 240);
  8. [self.view addSubview:imageView];
  9. /* 移动 */
  10. CABasicAnimation *animation1 =
  11. [CABasicAnimation animationWithKeyPath:@"transform.translation.y"];
  12. // 起止点的设定
  13. animation1.toValue = [NSNumber numberWithFloat:100];; // 終点
  14. /* 旋转 */
  15. CABasicAnimation *animation2 =
  16. [CABasicAnimation animationWithKeyPath:@"transform.rotation.x"];
  17. // 绕x轴转3圈
  18. animation2.toValue = [NSNumber numberWithFloat:66 * M_PI]; // 结束时的角度
  19. /* 动画组 */
  20. CAAnimationGroup *group = [CAAnimationGroup animation];
  21. group.delegate = self;
  22. group.duration = 5.0;
  23. group.repeatCount = 1;
  24. // 动画结束后不变回初始状态
  25. group.removedOnCompletion = NO;
  26. group.fillMode = kCAFillModeForwards;
  27. // 添加动画
  28. group.animations = [NSArray arrayWithObjects:animation1, animation2, nil nil];
  29. [imageView.layer addAnimation:group forKey:@"move-rotate-layer"];
  30. }
  31. /**
  32. * 动画开始时
  33. */
  34. - (void)animationDidStart:(CAAnimation *)theAnimation
  35. {
  36. NSLog(@"begin");
  37. }
  38. /**
  39. * 动画结束时
  40. */
  41. - (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag
  42. {
  43. NSLog(@"end");
  44. }

示例程序的执行结果

Objective-C的示例程序的执行结果如下:

控制台输出如下:

[plain] view plain copy

  1. begin
  2. end

转载于:https://my.oschina.net/u/2818284/blog/810621

CABasicAnimation的基本使用方法(移动·旋转·放大·缩小)相关推荐

  1. 纯js 编canvas处理图片, 涂鸦笔、画布图片内容旋转 放大缩小 裁剪框 。兼容ie9及以上 谷歌、360、火狐浏览器

    新手发帖多多关照,主要是最近做的一个系统,网上资源多是多但是烦而杂,能利用上的实在是没有,该dome非常简单,主要功能为 涂鸦笔.画布图片内容旋转 放大缩小  裁剪框 外加一个打印功能.关键代码均用红 ...

  2. v-viewer预览图的使用(图片预览旋转/放大缩小/上下切换等)

    前言: 之前项目需求,需要找一个预览图的组件,最开始,找了vue-preview组件.因为vue-preview是直接引入 < vue-preview>这个标签,无法看到对组件里面的图片i ...

  3. Jquery方法实现图片放大缩小

    利用dom的垂直分层实现图片的点击放大和缩小(手机上使用的效果较好),在图片放大的时候同时禁止页面的滑动,如果在web端的话可以不禁止屏幕的滚动(因为图片放大是将图片的宽度变成100%,在web上长度 ...

  4. iOS开发——手势识别器(用手势实现图片旋转和缩小放大)

    iOS开发中,除了有关触摸的这组方法来控制用户的手指触控外,还可以用UIGestureRecognize的衍生类来进行判断,方便了开发. UIGestureRecognize的子类类别有以下几种: U ...

  5. 自定义ImageView 实现双击放大缩小还原,无极缩小和旋转及拖动(多机型测试很稳定)

    /*** 该模块主要实现了放大和原大两个级别的缩放. 功能有: 1.以触摸点为中心放大(这个是网上其他的代码没有的) 2.取消边界控制(这个是网上其他的代码没有的)也可以添加边界控制 3.双击放大或缩 ...

  6. html 图片滚动 放大缩小,js实现图片旋转 js滚动鼠标中间对图片放大缩小

    从开通博客园到今天,有两个多月了.我发现之前没有开通博客记录自己所做的东西,真是后悔啊. 现在一点一点把自己所做的功能以博客的形式记录下来,一方面可以给大家分享,大家一起学习,同时自己也从新回顾一下. ...

  7. imageView图片放大缩小及旋转

    imageView图片放大缩小及旋转 一.简介 二.方法 1)设置图片放大缩小效果 第一步:将<ImageView>标签中的android:scaleType设置为"fitCen ...

  8. Glide图片旋转与放大缩小

    最近在项目中有用Glide去显示图片,其中有去实现图片旋转和当大缩小的功能,这里分享一下 图片的旋转: 首先通过一个类继承实现BitmapTransformation public class Rot ...

  9. glut 实现 horse.off 和colorcube的绘画以及按X,Y,Z轴旋转,放大缩小,上下移动图像的功能

    一.问题描述: 模型显示:从给定的off文件(ftp//Models/cube.off.horse.off)读入网格模型的顶点位置和面,显示在屏幕上 观察:(1) 上下左右方向键移动模型:       ...

最新文章

  1. 学习 JavaScript (四)核心概念:操作符
  2. 永动机之永动机的客观存在
  3. hihoCoder1233(2015北京网络赛H题)
  4. 在ASP.NET 3.5中使用新的ListView控件(5)
  5. 中改变了值但是数据没有刷新_SwiftUI数据流
  6. IntelliJ IDEA个人许可证赠品报告和获奖者
  7. iOS 网络/本地 图片 按自定义比例缩放 不失真 方法
  8. forrtl: error (200): program aborting due to control-C event
  9. github上传代码步骤
  10. 复利思维,静待时间的玫瑰慢慢绽放
  11. 新巴巴运动网项目需求书_巴巴姆少儿英语项目介绍(613岁)
  12. mysql sql 隐藏信息
  13. 硬盘数据传到计算机,如何把旧电脑硬盘上的数据复制传输到新电脑上
  14. 局域网被限速,爱快IP聚合突破限速,网管直呼内行
  15. 『随笔』基本功与招式
  16. 淘宝关键字搜索商品-v1
  17. python自动生成字幕_深度学习实现自动生成图片字幕
  18. 网页错误详细信息 用户代理: Mozilla/4.0 (compatible; MSIE 8.0;
  19. 论文查重检测及修改技巧
  20. 在MOSS 2007中自定义DataView Webpart的数据显示样式

热门文章

  1. 【研究】刘知远:如何写一篇合格的NLP论文
  2. ElasticSearch个人学习笔记 狂神说
  3. light动名词_初中英语语法学习:动名词专项训练
  4. python高级编程函数_Python高级编程之十大装B语法
  5. uniapp开发小程序推送微信消息
  6. 人工智能、机器学习、深度学习的联系与区别
  7. visual studio code 重置所有设置(还原默认设置)
  8. YYKit--YYWeakProxy
  9. 面试官之瞳——《技术之瞳——阿里巴巴技术笔试心得》
  10. win10系统如何解决管理员已阻止你运行此应用