1. iOS动画原理

  • 本质:动画对象(这里是UIView)的状态,基于时间变化的反应
  • 分类:可以分为显式动画(关键帧动画和逐帧动画)和隐式动画
  • 关键帧和逐帧总结:关键帧动画的实现方式,只需要修改某个属性值就可以了,简单方便,但涉及的深层次内容较多,需要更多的理解和练习。采用逐帧动画的实现方式,实现原理简单,但绘制动画的过程要复杂。如果动画过程处理的事情较多,也会带来较大的开销,就有可能造成动画帧数的下降,出现卡顿的现象,因此需要较多的测试和调试。

1.1 显式动画(逐帧动画和关键帧动画)

显式动画本质是我们显式地给CALayer添加一个动画

  • 逐帧动画

    • 用户需要周期性的调用绘制方法,绘制每帧的动画对象,系统操作方法简单,但用户操作的工作量就会大一些
    • 周期性这边指的是定时器CADisplayLink,其基于屏幕刷效率的,即屏幕每次刷新时就会触发调用(iPhone为60FPS)。
    • 绘制指的是对UIView背后对应的主CALayer进行的修改,这边的修改包括- drawRect:方法和UIView的属性渐变(改变颜色尺寸等)。
    • 注意1:因为有些时候绘制过程相对复杂,所以一般采用每隔一帧进行绘制,相当于30FPS的刷新率。另外著名的pop动画框架,就是用CADisplayLink进行的逐帧动画。
    • 注意2:如果在逐帧绘制的方法中修改了一个自建的CALayer,这个CALayer不是对应某个UIView的,需注意系统的隐式动画的影响,后面会提到这点。
  • 关键帧动画

    • 主要是使用两个关键帧---起始帧和结束帧,再配合别的关键信息(如动画时间和运动类型等)
    • 每个CALayer都有一个属性来表示成坐标,我们可以修改模型层modelLayer来改变展现层presentationLayer来形成动画效果。
    • 整个动画过程,通过坐标层次来看如下所示:
      • 动画前,显示模型层的当前值;
      • 动画开始,切换显示展现层的值;
      • 动画过程中,展现层的值根据时间变化,我们看到的实际是展现层的值在变化;
      • 动画结束,切换回显示模型层的值,此时模型层的值应被修改为动画结束时的值。
    • 代码注释如下:
      UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
      view.backgroundColor = [UIColor redColor];
      [self.view addSubview:view]; // CABasicAnimation指定一个keyPath,详见官方API
      // 常见keyPath:transform.scale/transform.translation.x/position.x(非3D平移)
      CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position.x"];
      // 开始帧
      animationWithKeyPath.fromValue = @(100);
      // 结束帧
      animationWithKeyPath.fromValue = @(200);
      // 动画时间
      animation.duration = 2.0;
      // 永久重复动画
      animation.repeatCount = HUGE;
      // 代理方法:
      // - (void)animationDidStart:(CAAnimation *)anim;
      // - (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag;
      animation.delegate = self;
      // fillMode:决定当前对象在非active时间段的行为.比如动画开始之前,动画结束之后
      animation.fillMode = kCAFillModeForwards;
      // removedOnCompletion:默认为YES,代表动画执行完毕后就从图层上移除,图形会恢复到动画执行前的状态。如果想让图层保持显示动画执行后的状态,那就设置为NO,不过还要设置fillMode为kCAFillModeForwards
      animation.removedOnCompletion = NO;
      // autoreverses:动画结束时是否执行逆动画
      animation.autoreverses = NO;
      // timingFunction:动画类型,设定动画的速度变化
      animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
      // 给CALayer添加一个动画,该动画为CAAnimation类型,其子类有CABasicAnimation/CAKeyframeAnimation/CAAnimationGroup/CATransition(图层过度动画,有filter属性)
      [view.layer addAnimation:animation forKey:nil];

1.2 隐式动画

当前UIView的主CALayer称为根层,自动另外创建的CALayer为非根层,对非根层的部分可动画属性修改时,就是隐式动画。

  • 直接对UIView或其CALayer设置一个可动画的属性值时,会出发系统的隐式动画,可动画的属性值,可以在UIView或其CALayer的文档中找到,属性标有Animatable
  • 注意:
    • 因为主CALayer,系统默认关闭了隐式动画,所以当我们直接修改这些可动画属性值时,变化时直接生效的,没有动画效果。
    • 如果修改的是一个自建的单独CALayer时,帧与帧之间的变化还是会触发系统的默认隐式动画,这个时候就需要我们来手动关闭隐式动画
    • 隐式动画所做的事情和显示动画是一样的,我们设置的属性值都是模型层的数值,而系统会自动添加属性对应的CAAnimation动画到CALayer上。
    • UIView有一系列的animateWithDuration动画方法,在这些方法中UIView会恢复隐式动画,所以在动画的block中修改属性时,又会触发隐式动画。

iOS动画原理的更多相关文章

  1. 解析 iOS 动画原理与实现

    这篇文章不会教大家如何实现一个具体的动画效果,我会从动画的本质出发,来说说 iOS 动画的原理与实现方式. 什么是动画 动画,顾名思义,就是能“动”的画.人的眼睛对图像有短暂的记忆效应,所以当眼睛看到 ...

  2. 简析iOS动画原理及实现——Core Animation

    本文转载至 http://www.tuicool.com/articles/e2qaYjA 原文  https://tech.imdada.cn/2016/06/21/ios-core-animati ...

  3. Atitit 视频编码与动画原理attilax总结

    Atitit 视频编码与动画原理attilax总结 1.1. 第一步:实现有损图像压缩和解压1 1.2. 接着将其量化,所谓量化,就是信号采样的步长,1 1.3. 第二步:实现宏块误差计算2 1.4. ...

  4. SVG描边动画原理

    SVG描边动画原理其实很简单,主要利用以下两个属性 stroke-dasharray 制作虚线,使得黑白相间, stroke-dashoffset 使得虚线向开头偏移,这里的1500不精确,是我随便取 ...

  5. JS实现动画原理一(闭包方式)

    前提:      你必须了解js的闭包(否则你看不懂滴)     我们就来做一个js实现jq animate的动画效果来简单探索一下,js动画实现的简单原理: html代码 <div id=&q ...

  6. (转)iOS动画Core Animation

    文章转载:http://blog.sina.com.cn/s/blog_7b9d64af0101b8nh.html 在iOS中动画实现技术主要是:Core Animation. Core Animat ...

  7. IOS动画隐式,显式,翻页

    //  ViewController.m //  IOS动画0817 // //  Created by 张艳锋 on 15/8/17. //  Copyright (c) 2015年 张艳锋. Al ...

  8. 【Xamarin挖墙脚系列:Xamarin.IOS机制原理剖析】

    原文:[Xamarin挖墙脚系列:Xamarin.IOS机制原理剖析] [注意:]团队里总是有人反映卸载Xamarin,清理不完全.之前写过如何完全卸载清理剩余的文件.今天写了Windows下的批命令 ...

  9. iOS 动画基础

    原文:http://www.cnblogs.com/lujianwenance/p/5733846.html   今天说一下有关动画的基础,希望能帮助到一些刚接触iOS动画或者刚开始学习iOS的同学, ...

随机推荐

  1. poj 1679 The Unique MST(唯一的最小生成树)

    http://poj.org/problem?id=1679 The Unique MST Time Limit: 1000MS   Memory Limit: 10000K Total Submis ...

  2. 关于delete和delete[]

    [精彩] 求问delete和delete[] 的区别??http://www.chinaunix.net/jh/23/311058.html C++告诉我们在回收用 new 分配的单个对象的内存空间的 ...

  3. HDU4651+数学公式

    见Goolgle http://zh.wikipedia.org/zh-cn/%E6%95%B4%E6%95%B8%E5%88%86%E6%8B%86 /* 数学公式 ans[i]:i可以有ans[i ...

  4. php关于private、public成员变量访问问题

    如果类里面定义了__get($name)方法,则不论类的private成员还是public成员,都能够在类的外面通过类似$class->name访问到.如果是public变量,则不会自动调用ge ...

  5. C++不同进制整数

    在C++的整数常量中,整数分为十进制整数.八进制整数和十六进制整数. 那给出一个整型常量怎样区分是何种进制呢?/给出一个整型常量,如100,默认是十进制数,如果在该数前加0,如0100,则此数表示为八 ...

  6. SPRING IN ACTION 第4版笔记-第八章Advanced Spring MVC-007-给flowl加权限控制<secured>

    States, transitions, and entire flows can be secured in Spring Web Flow by using the <secured> ...

  7. intelliJ idea读取资源文件

    原文:intelliJ idea读取资源文件 原文地址 http://yanwushu.sinaapp.com/intellij-idea_raed_resource_file/ 官方文档 以下是je ...

  8. Windows8、Windows8.1和Microsoft Office 2013激活

    KMS激活软件: 什么是KMS?什么是伪激活?http://tieba.baidu.com/p/3224677648 KMSpico激活软件:链接: http://pan.baidu.com/s/1e ...

  9. CodeForces250B——Restoring IPv6(字符串处理)

    Restoring IPv6 DescriptionAn IPv6-address is a 128-bit number. For convenience, this number is recor ...

  10. R语言笔记:快速入门

    1.简单会话 > x<-c(1,2,4) > x [1] 1 2 4 R语言的标准赋值运算符是<-.也可以用=,不过不建议用它,有些情况会失灵.其中c表示连接(concaten ...