Core Animation,即为核心动画,它是一组非常强大的动画处理API,使用它能做出非常炫丽的动画效果,而且往往是事半功倍。也就是说,使用少量的代码就可以实现非常强大的功能。Core Animation可以用在Mac OS X和iOS平台。Core Animation的动画执行过程都是在后台操作的,不会阻塞主线程。要注意的是,Core Animation是直接作用在CALayer上的,并非UIView。

1. 使用步骤

  1. 使用它需要先添加QuartzCore.framework框架和引入主头文件<QuartzCore/QuartzCore.h>(iOS7不需要);
  2. 初始化一个CAAnimation对象,并设置一些动画相关属性;
  3. 通过调用CALayer的addAnimation:forKey:方法增加CAAnimation对象到CALayer中,这样就能开始执行动画了;
  4. 通过调用CALayer的removeAnimationForKey:方法可以停止CALayer中的动画。

2. 结构

CAAnimation是所有动画对象的父类,负责控制动画的持续时间和速度,是个抽象类,不能直接使用,应该使用它具体的子类。属性:

duration:动画的持续时间
repeatCount:动画的重复次数
repeatDuration:动画的重复时间
removedOnCompletion:默认为YES,代表动画执行完毕后就从图层上移除,图形会恢复到动画执行前的状态。如果想让图层保持显示动画执行后的状态,那就设置为NO,不过还要设置fillMode为kCAFillModeForwards
fillMode:决定当前对象在非active时间段的行为。比如动画开始之前,动画结束之后
beginTime:可以用来设置动画延迟执行时间,若想延迟2s,就设置为CACurrentMediaTime()+2,CACurrentMediaTime()为图层的当前时间
timingFunction:速度控制函数,控制动画运行的节奏
delegate:动画代理

3. 子类

  1. CAPropertyAnimation,是CAAnimation的子类,也是个抽象类,要想创建动画对象,应该使用它的两个子类:CABasicAnimation和CAKeyframeAnimation。

    属性解析:

    1. keyPath:通过指定CALayer的一个属性名称为keyPath(NSString类型),并且对CALayer的这个属性的值进行修改,达到相应的动画效果。比如,指定@”position”为keyPath,就修改CALayer的position属性的值,以达到平移的动画效果。
  2. CABasicAnimation

    属性解析:

    1. fromValue:keyPath相应属性的初始值。
    2. toValue:keyPath相应属性的结束值。
    3. 随着动画的进行,在长度为duration的持续时间内,keyPath相应属性的值从fromValue渐渐地变为toValue。
    4. 如果fillMode=kCAFillModeForwards和removedOnComletion=NO,那么在动画执行完毕后,图层会保持显示动画执行后的状态。但在实质上,图层的属性值还是动画执行前的初始值,并没有真正被改变。比如,CALayer的position初始值为(0,0),CABasicAnimation的fromValue为(10,10),toValue为(100,100),虽然动画执行完毕后图层保持在(100,100)这个位置,实质上图层的position还是为(0,0)。
  3. CAKeyframeAnimation,CApropertyAnimation的子类,跟CABasicAnimation的区别是:CABasicAnimation只能从一个数值(fromValue)变到另一个数值(toValue),而CAKeyframeAnimation会使用一个NSArray保存这些数值。

    属性解析:

    1. values:就是上述的NSArray对象。里面的元素称为”关键帧”(keyframe)。动画对象会在指定的时间(duration)内,依次显示values数组中的每一个关键帧。
    2. path:可以设置一个CGPathRef\CGMutablePathRef,让层跟着路径移动。path只对CALayer的anchorPoint和position起作用。如果你设置了path,那么values将被忽略。
    3. keyTimes:可以为对应的关键帧指定对应的时间点,其取值范围为0到1.0,keyTimes中的每一个时间值都对应values中的每一帧.当keyTimes没有设置的时候,各个关键帧的时间是平分的。
    4. CABasicAnimation可看做是最多只有2个关键帧的CAKeyframeAnimation。
  4. CAAnimationGroup,CAAnimation的子类,可以保存一组动画对象,将CAAnimationGroup对象加入层后,组中所有动画对象可以同时并发运行。

    属性解析:

    1. animations:用来保存一组动画对象的NSArray。
    2. 默认情况下,一组动画对象是同时运行的,也可以通过设置动画对象的beginTime属性来更改动画的开始时间。
  5. CATransition,CAAnimation的子类,用于做转场动画,能够为层提供移出屏幕和移入屏幕的动画效果。iOS比Mac OS X的转场动画效果少一点。UINavigationController就是通过CATransition实现了将控制器的视图推入屏幕的动画效果。

    属性解析:

    1. type:动画过渡类型。
    2. subtype:动画过渡方向。
    3. startProgress:动画起点(在整体动画的百分比)。
    4. endProgress:动画终点(在整体动画的百分比)。
      1. /* 过渡效果
    5.   fade     //交叉淡化过渡(不支持过渡方向) kCATransitionFade
    6.   push     //新视图把旧视图推出去  kCATransitionPush
    7.   moveIn   //新视图移到旧视图上面   kCATransitionMoveIn
        reveal   //将旧视图移开,显示下面的新视图  kCATransitionReveal
        cube     //立方体翻滚效果
        oglFlip  //上下左右翻转效果
        suckEffect   //收缩效果,如一块布被抽走(不支持过渡方向)
        rippleEffect //滴水效果(不支持过渡方向)
        pageCurl     //向上翻页效果
        pageUnCurl   //向下翻页效果
        cameraIrisHollowOpen  //相机镜头打开效果(不支持过渡方向)
        cameraIrisHollowClose //相机镜头关上效果(不支持过渡方向)
       */    
       /* 过渡方向
        kCATransitionFromRight
        kCATransitionFromLeft
        kCATransitionFromBottom 
        kCATransitionFromTop
        */
      // CATransition的使用 
      CATransition *anim = [CATransition animation];
      anim.type = @"cube"// 动画过渡类型
      anim.subtype = kCATransitionFromTop; // 动画过渡方向
      anim.duration = 1; // 动画持续1s
      // 代理,动画执行完毕后会调用delegate的animationDidStop:finished:
      anim.delegate = self;
      1. UIView动画

        UIKit直接将动画集成到UIView类中,当内部的一些属性发生改变时,UIView将为这些改变提供动画支持.

        执行动画所需要的工作由UIView类自动完成,但仍要在希望执行动画时通知视图,为此需要将改变属性的代码放在[UIView beginAnimations:nil context:nil]和[UIView commitAnimations]之间

        常见方法解析:

        + (void)setAnimationDelegate:(id)delegate

        设置动画代理对象,当动画开始或者结束时会发消息给代理对象

        + (void)setAnimationWillStartSelector:(SEL)selector

        当动画即将开始时,执行delegate对象的selector,并且把beginAnimations:context:中传入的参数传进selector

        + (void)setAnimationDidStopSelector:(SEL)selector

        当动画结束时,执行delegate对象的selector,并且把beginAnimations:context:中传入的参数传进selector

        //说明需要执行动画
        [UIView beginAnimations:nil context:nil];
        //设置动画持续时间
        [UIView setAnimationDuration:];
        //设置转场动画
        [UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:self.view cache:YES];
        //交换子视图的位置
        [self.view exchangeSubviewAtIndex: withSubviewAtIndex:];
        //提交动画
        [UIView commitAnimations];

        UIView动画

        + (void)setAnimationDuration:(NSTimeInterval)duration
        //动画的持续时间,秒为单位
        + (void)setAnimationDelay:(NSTimeInterval)delay
        //动画延迟delay秒后再开始
        + (void)setAnimationStartDate:(NSDate *)startDate
        //动画的开始时间,默认为now
        + (void)setAnimationCurve:(UIViewAnimationCurve)curve
        //动画的节奏控制,具体看下面的”备注”
        + (void)setAnimationRepeatCount:(float)repeatCount
        //动画的重复次数
        + (void)setAnimationRepeatAutoreverses:(BOOL)repeatAutoreverses
        //如果设置为YES,代表动画每次重复执行的效果会跟上一次相反
        + (void)setAnimationTransition:(UIViewAnimationTransition)transitionforView:(UIView *)view cache:(BOOL)cache

        Block动画

        + (void)animateWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion

        参数解析:

        duration:动画的持续时间

        delay:动画延迟delay秒后开始

        options:动画的节奏控制

        animations:将改变视图属性的代码放在这个block中

        completion:动画结束后,会自动调用这个block

        + (void)transitionWithView:(UIView *)view duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion

        参数解析:

        duration:动画的持续时间

        view:需要进行转场动画的视图

        options:转场动画的类型

        animations:将改变视图属性的代码放在这个block中

        completion:动画结束后,会自动调用这个block

        + (void)transitionFromView:(UIView *)fromView toView:(UIView *)toView duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options completion:(void (^)(BOOL finished))completion

        方法调用完毕后,相当于执行了下面两句代码:

        // 添加toView到父视图

        [fromView.superview addSubview:toView];

        // 把fromView从父视图中移除

        [fromView.superview removeFromSuperview];

        参数解析:

        duration:动画的持续时间

        options:转场动画的类型

        animations:将改变视图属性的代码放在这个block中

        completion:动画结束后,会自动调用这个block

        UIImageView的帧动画

        UIImageView可以让一系列的图片在特定的时间内按顺序显示 .

        相关属性解析:

        animationImages:要显示的图片(一个装着UIImage的NSArray) .

        animationDuration:完整地显示一次animationImages中的所有图片所需的时间 .

        animationRepeatCount:动画的执行次数(默认为0,代表无限循环)

        相关方法解析:

        - (void)startAnimating; 开始动画 .

        - (void)stopAnimating;  停止动画 .

        - (BOOL)isAnimating;  是否正在运行动画.

        UIActivityIndicatorView

        是一个旋转进度轮,可以用来告知用户有一个操作正在进行中,一般用initWithActivityIndicatorStyle初始化

        方法解析:

        - (void)startAnimating;开始动画

        - (void)stopAnimating;  停止动画

        - (BOOL)isAnimating;  是否正在运行动画

        UIActivityIndicatorViewStyle有3个值可供选择:

        UIActivityIndicatorViewStyleWhiteLarge   //大型白色指示器

        UIActivityIndicatorViewStyleWhite      //标准尺寸白色指示器

        UIActivityIndicatorViewStyleGray    //灰色指示器,用于白色背景

iOS开发CAAnimation详解的更多相关文章

  1. iOS开发——Block详解

    iOS开发--Block详解 1. Block是什么 代码块 匿名函数 闭包--能够读取其他函数内部变量的函数 函数变量 实现基于指针和函数指针 实现回调的机制 Block是一个非常有特色的语法,它可 ...

  2. iOS开发:详解Objective-C runTime

    Objective-C总Runtime的那点事儿(一)消息机制 最近在找工作,Objective-C中的Runtime是经常被问到的一个问题,几乎是面试大公司必问的一个问题.当然还有一些其他问题也几乎 ...

  3. iOS开发-Runtime详解

    iOS开发-Runtime详解 简介 Runtime 又叫运行时,是一套底层的 C 语言 API,其为 iOS 内部的核心之一,我们平时编写的 OC 代码,底层都是基于它来实现的.比如: [recei ...

  4. iOS开发——MVC详解&Swift+OC

    MVC 设计模式 这两天认真研究了一下MVC设计模式,在iOS开发中这个算是重点中的重点了,如果对MVC模式不理解或者说不会用,那么你iOS肯定学不好,或者写不出好的东西,当然本人目前也在学习中,不过 ...

  5. IOS开发之----详解在IOS后台执行

    文一 我从苹果文档中得知,一般的应用在进入后台的时候可以获取一定时间来运行相关任务,也就是说可以在后台运行一小段时间. 还有三种类型的可以运行在后以,1.音乐2.location 3.voip 文二 ...

  6. iOS开发--Bison详解连连支付集成简书

    "最近由于公司项目需要集成连连支付,文档写的不是很清楚,遇到了一些坑,因此记录一下,希望能帮到有需要的人." 前面简单的集成没有遇到什么坑,在此整理一下官方的集成文档,具体步骤如下 ...

  7. iOS开发-NSURLSession详解

    Core Foundation中NSURLConnection在2003年伴随着Safari浏览器的发行,诞生的时间比较久远,iOS升级比较快,AFNetWorking在3.0版本删除了所有基于NSU ...

  8. iOS开发之详解正则表达式

    本文由Charles翻自raywenderlich原文:NSRegularExpression Tutorial: Getting Started更新提示:本教程被James Frost更新到了iOS ...

  9. iOS开发-Runtime详解(简书)

    简介 Runtime 又叫运行时,是一套底层的 C 语言 API,其为 iOS 内部的核心之一,我们平时编写的 OC 代码,底层都是基于它来实现的.比如: [receiver message]; // ...

随机推荐

  1. Appium1.9.1 之 Desired Capabilities 释疑

    服务关键字 Desired Capabilities在启动session的时候是必须提供的. Desired Capabilities本质上是以key value字典的方式存放,客户端将这些键值对发给 ...

  2. jquery计算时间差(天、时、分、秒)并使用定时器实时获取

    类似网站抢购需求,会有个时间倒计时的展示(天.时.分.秒) 要拿到最终时间与当前时间对比,算出时间差并用定时器以秒的方式执行 实现代码: $(document).ready(function(){ r ...

  3. 手把手实战:eclipse 搭建 SpringMvc 框架环境

    环境准备 eclipse jdk1.8 tomcat 7 步骤总纲       a.准备好开发环境     b.下载相关jar包     c.在eclipse 中创建好工程     d.引进下载的ja ...

  4. ucml JS调用其它页面上的服务端方法

    var params = { _bpoName: "BPO_KH_ED" + "Service", //BPO的名字(拥有那个服务端函数的BPO) _metho ...

  5. 转载 【.NET基础】--委托、事件、线程(3)

      之前的两篇文章我们了解了委托和事件,本文我们看一下线程. 1,一个窗体程序,默认拥有一个线程(相当于一个商店里面,只有一个店员),这个默认的线程叫做 UI线程/主线程. 2,进程和线程的关系: A ...

  6. go-simplejson文档学习

    https://godoc.org/github.com/bitly/go-simplejson 导入方式: import "github.com/bitly/go-simplejson&q ...

  7. 如何在Qt Creator中添加库文件和头文件目录

    在使用QtCreator开发图像处理程序的时候想加入Opencv库来处理图形,添加头文件,需要编辑工程文件夹下的.pro文件在文件中添加以下内容,即可包含头文件的文件夹: INCLUDEPATH += ...

  8. SpringBoot 异常处理

    异常处理最佳实践 根据我的工作经历来看,我主要遵循以下几点: 尽量不要在代码中写try...catch.finally把异常吃掉. 异常要尽量直观,防止被他人误解 将异常分为以下几类,业务异常,登录状 ...

  9. .NET Core 3.0 跟踪

    Preview1: https://blogs.msdn.microsoft.com/dotnet/2018/12/04/announcing-net-core-3-preview-1-and-ope ...

  10. WPF中TreeView.BringIntoView方法的替代方案

    原文:WPF中TreeView.BringIntoView方法的替代方案 WPF中TreeView.BringIntoView方法的替代方案 周银辉 WPF中TreeView.BringIntoVie ...