Core Animation 是iOS动画技术的根本。 视图动画和隐式图层动画都仅仅是Core Animation的方便包装。 Core Animation 是显式图层动画,让你创造更加绚丽的动画。

让视图的根图层执行动画是一种图层动画,而不是视图动画--因此不会对视图的子视图进行自动布局,所以我们常常喜欢使用视图动画,而不是图层动画。


CABasicAnimation and Its Inheritance

通过Core Animation驱动一个属性执行动画的最简单方法就是使用CABasicAnimation对象。通过继承CABasicAnimation,可以发挥它的强大力量,所以下面我只会讲解CABasicAnimation的继承,你可以体会到所有目前我们看到的属性动画都体现在CABasicAnimation实例中。

CAAnimation

CAAnimation是一个抽象类,这意味着你将永远只能用它的一个子类。有些CAAnimation的功能来自于它实现的CAMediaTiming协议,协议中定义了8个属性。

  • animation

    一个类方法,创建一个动画对象的方便形式

  • delegate

    这个委托的消息是 animationDidStart: and animationDidStop:finished:。

    一个CAAnimation实例会保留它的委托; 这是非常不寻常的行为,如果你不明白它(我的经验之谈可能会导致麻烦。另外,为了让你的代码在动画结束时调用,不要设置一个委托,而是在配置动画之前,调用CATransaction 的类方法setCompletionBlock:。

  • duration, timingFunction

    动画的长度和它的时间函数(一个 CAMediaTiming 函数)。 持续时间为0(默认值)表示 0.25秒,除非通过事务来覆盖。

  • autoreverses, repeatCount, repeatDuration, cumulative

    前两个是类似与UIView的动画。该repeatDuration属性是用不同的方式来管理重复,指定重复应该持续多久而不是应该重复多少次;不要同时指定repeatCount和repeatDuration。如果cumulative属性时YES,一个重复的动画时从上一个重复的动画结束的地方开始每个重复(而不是每次都跳到开始的值来重复)。

  • beginTime

    动画开始前的延时。为了从现在开始延时一个动画,调用 CACurrentMediaTime 和添加一个指定的延时秒数。这个延时不会计算在动画的持续时间里。

  • timeOffset

    timeOffset属性有点难理解,它对时间进行偏移(offset)。具体的内容,又一篇文章做了解析: http://www.cocoachina.com/programmer/20131218/7569.html

CAAnimation,连同其所有的子类,实现了KVC,允许您通过一个key来设置和获取任意值,类似的CALayer和CATransaction。

CAPropertyAnimation

CAPropertyAnimation是CAAnimation的一个子类,也是抽象的,添加了下面的:

  • keyPath

    通过CAPropertyAnimation类方法 animationWithKeyPath: ,传入一个keyPath来创建一个实例。

  • additive

    如果是YES,由动画所提供的值将会被添加到当前显示层的值。

  • valueFunction

    转换一个你提供的简单标量值到一个transform。

CABasicAnimation

CABasicAnimation是CAPropertyAnimation的一个子类(不是抽象的),添加了下面的:

  • fromValue, toValue

    动画的起始和结束值。这些值必须是对象,所以数字和结构体将必须使用NSNumber和NSValue包装。如果不设置fromValue和toValue,将会使用以前和现在的值。如果只是提供fromValue或toValue的一个,另一个使用该属性的当前值。

  • byValue

    通过设置这个值和 fromValue 、toValue中的中的一个,系统会自动帮你通过加法或减法来算出另一个值。如果你只设置了byValue,那么fromValue就是属性的当前值。


Using a CABasicAnimation

既然已经构造和配置了一个CABasicAnimation,那么我们执行它的方式就是把它添加到一个图层上。 通过CALayer的实例方法 addAnimation:forKey:(后面会讲这个key的作用,现在我们只需传nil就可以了)。

但是,CAAnimation只是一个动画,动画播放完了,你的图层仍然会在动画开始前的位置,什么都没有改变,你需要保证图层与动画的结束值对应上。毕竟我们是使用显式动画,更加底层,需要多加小心。

一般的步骤是:

  1. 捕获需要改变的图层属性的开始和结束值。

  2. 改变图层的属性为它的动画结束值,如果需要防止隐式动画,可以首先调用

setDisableActions:方法。

  1. 使用你刚刚捕获的值和这个属性对应的keyPath来构造显式动画。

  2. 添加显式动画到图层上。

下面就是对我们的箭头执行旋转动画:

// capture the start and end values
CATransform3D startValue = arrow.transform;
CATransform3D endValue =CATransform3DRotate(startValue, M_PI/4.0, 0, 0, 1);
// change the layer, without implicit animation
[CATransaction setDisableActions:YES];
arrow.transform = endValue;
// construct the explicit animation
CABasicAnimation* anim =[CABasicAnimation animationWithKeyPath:@"transform"];
anim.duration = 0.8;
CAMediaTimingFunction* clunk =[CAMediaTimingFunction functionWithControlPoints:.9 :.1 :.7 :.9];
anim.timingFunction = clunk;
anim.fromValue = [NSValue valueWithCATransform3D:startValue];
anim.toValue = [NSValue valueWithCATransform3D:endValue];
// ask for the explicit animation
[arrow addAnimation:anim forKey:nil];

一旦你知道了完整形式,你会发现,在许多情况下,它可以浓缩。例如,当fromValue和toValue都没有设置,该属性的以前和现在值会自动使用(这是可能的,因为在表现层有了新的值时,它仍然由原来的属性的值)。因此,在这种情况下,没有必要对其进行设置,因此没有必要事先捕捉开始和结束值。这里的浓缩版:

[CATransaction setDisableActions:YES];
arrow.transform =CATransform3DRotate(arrow.transform, M_PI/4.0, 0, 0, 1);
CABasicAnimation* anim =[CABasicAnimation animationWithKeyPath:@"transform"];
anim.duration = 0.8;
CAMediaTimingFunction* clunk =[CAMediaTimingFunction functionWithControlPoints:.9 :.1 :.7 :.9];
anim.timingFunction = clunk;
[arrow addAnimation:anim forKey:nil];

让我们的箭头出现快速振动:

// capture the start and end values
CATransform3D nowValue = arrow.transform;
CATransform3D startValue =CATransform3DRotate(nowValue, M_PI/40.0, 0, 0, 1);
CATransform3D endValue =CATransform3DRotate(nowValue, -M_PI/40.0, 0, 0, 1);
// construct the explicit animation
CABasicAnimation* anim =[CABasicAnimation animationWithKeyPath:@"transform"];
anim.duration = 0.05;
anim.timingFunction =[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
anim.repeatCount = 3;
anim.autoreverses = YES;
anim.fromValue = [NSValue valueWithCATransform3D:startValue];
anim.toValue = [NSValue valueWithCATransform3D:endValue];
// ask for the explicit animation
[arrow addAnimation:anim forKey:nil];

的确,上面的代码还可以简化,我们可以无需基于当前新的旋转值方向计算下一个旋转值,只需设置additive为YES;这意味着,动画的属性值被添加到我们现有的属性值,所以它们是相对的,不是绝对的。

CABasicAnimation* anim =[CABasicAnimation animationWithKeyPath:@"transform"];
anim.duration = 0.05;
anim.timingFunction =[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
anim.repeatCount = 3;
anim.autoreverses = YES;
anim.additive = YES;
anim.valueFunction =[CAValueFunction functionWithName:kCAValueFunctionRotateZ];
anim.fromValue = @(M_PI/40);
anim.toValue = @(-M_PI/40);
[arrow addAnimation:anim forKey:nil];

转载于:https://www.cnblogs.com/YungMing/p/4032646.html

Core Animation (1)相关推荐

  1. iOS核心动画Core Animation(一)

    核心动画Core Animation(一) 一.简述 Core Animation是直接作用在CALayer上的(并非UIView上)非常强大的跨Mac OS X和iOS平台的动画处理API,Core ...

  2. Core Animation (2)

    Keyframe Animation 关键帧动画 关键帧动画(CAKeyframeAnimation)是一种可以替代基本动画的动画(CABasicAnimation);它们都是CAPropertyAn ...

  3. iOS Instrument使用之Core Animation(图形性能)

    Core Animation图形性能 Debug Options 1Color Blended Layers 图层混合 2 Color Hits Green and Misses Red 图层缓存 3 ...

  4. [Cocoa]深入浅出Cocoa之Core Data(4)- 使用绑定

    深入浅出 Cocoa 之 Core Data(4)- 使用绑定 罗朝辉 (http://www.cnblogs.com/kesalin/) 本文遵循"署名-非商业用途-保持一致"创 ...

  5. Android画图学习总结(四)——Animation(中)

    在Android画图学习总结(四)--Animation(上)中详细介绍了Tween Animation的定义.使用,由于篇幅有限,很多中重要的方面没有说明,这篇文章一方面做个完整的总结说明,另外一方 ...

  6. Core Data(4)- 使用绑定

    深入浅出 Cocoa 之 Core Data(4)- 使用绑定 罗朝辉(http://blog.csdn.net/kesalin) CC 许可,转载请注明出处 前面讲解了 Core Data 的框架, ...

  7. Core Data(3)- 使用绑定

    深入浅出 Cocoa 之 Core Data(3)- 使用绑定 罗朝辉(http://blog.csdn.net/kesalin) CC 许可,转载请注明出处 前面讲解了 Core Data 的框架, ...

  8. [Cocoa]深入浅出 Cocoa 之 Core Data(2)- 手动编写代码

    深入浅出 Cocoa 之 Core Data(2)- 代码示例 罗朝辉(http://blog.csdn.net/kesalin) CC 许可,转载请注明出处 前面 详细讲解了 Core Data 的 ...

  9. [Cocoa]深入浅出 Cocoa 之 Core Data(1)- 框架详解

    深入浅出 Cocoa 之 Core Data(1)- 框架详解 罗朝辉(http://blog.csdn.net/kesalin) CC 许可,转载请注明出处 Core data 是 Cocoa 中处 ...

最新文章

  1. 客户端与服务器的数据交互
  2. C语言snmp编程视频,在Ubuntu18.04中关于C语言使用netsnmp进行snmp编程
  3. 通俗易懂,常用线程池执行的-流程图
  4. java培训学费_北京Java培训班学费很贵吗,包含了哪些收费项目
  5. Final Michael Scofield
  6. data structure最短路径问题
  7. oracle 11g job创建,Oracle 11g 手动创建库完整实施过程
  8. 前端工程打开速度优化的循序渐进总结
  9. JavaScript 中 2个等号(==)和 3个等号(===)之间的区别
  10. 恶意软件利用Windows故障诊断平台传播
  11. Python制作某电商平台商品竞拍脚本,能自动定时、抢拍、购买
  12. 哈工大车万翔团队:口语语言理解的最新进展与前沿
  13. javaScript实现a页面触发b页面事件-小小笔记
  14. Java常用工具类-发短信(集成河南华夏通信短信网关)
  15. 计算机桌面进入安全模式,win7安全模式无法入桌面怎么办?无法进入桌面解法...
  16. C++部分函数调用形式耗时测试
  17. HTMl综合各大网站谈谈Meta标签和meta property=og标签含义
  18. html视频怎么转换成图片,WPS演示如何将图片转换成视频?
  19. springboot自动配置原理
  20. 盘点安卓绿色联盟2018全年技术沙龙干货分享

热门文章

  1. 操作系统(四)——文件管理
  2. c语言的复试笔试题目,c语言面试最必考的十道试题,求职必看!!!
  3. GO+ 教程总览(二)
  4. jQuery遍历——过滤
  5. 用css写一个向下的箭头
  6. 数据结构-----引论
  7. okhttp的应用详解与源码解析--android网络请求框架发展史
  8. 扎心!为何HR看了你的简历却不通知面试?
  9. Firefox 浏览器能,IE为什么不能?
  10. 接口自动化-接口自动化测试注意情况