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. 关于new

    JS通过new关键字,可以调用相关的 构造方法 生成一个 对象 ,function ---> object

  2. arcgis api for javascript中使用proxy.jsp

    当我们使用arcgis api for javascript 查询arcgis服务时,如果查询的参数很长时,通过get方式提交会查询不到结果,因为get方式提交的参数有长度限制,需要通过代理的方式使用 ...

  3. 在Oracle中使用Guid

    sys_guid()  -  唯一索引 在Oracle中可以用SYS_GUID()来生成一个guid,相当于msSql中的newid(). 在Oracle9i和Oracle 10g 里SYS_GUID ...

  4. python五十四课——datetime模块

    3.datetime模块:理解:datetime可以认为是time模块的补充/扩展datetime模块中有一些常用类:datetime类:记录了日期和时间数据信息date类:记录了日期数据信息time ...

  5. python设计模式之单例

    """ 单例模式 1.第一种方法 修改__new__方法 2.第二种方法 python import 就是一个单例模式 把要单例的类封装到一个py文件中 "&q ...

  6. StringRedisTemplate操作redis数据

    StringRedisTemplate与RedisTemplate区别点 两者的关系是StringRedisTemplate继承RedisTemplate. 两者的数据是不共通的:也就是说String ...

  7. 使用js切割URL的参数

    对于一些开发场景,不使用Jsp或freemarker及其其他的模板引擎时,通常通过切割url获得对应的参数,然后通过AJAX与后台交互得到对应的数据 下面是演示实例: test.html <!D ...

  8. 【Codeforces Round 1120】Technocup 2019 Final Round (Div. 1)

    Codeforces Round 1120 这场比赛做了\(A\).\(C\)两题,排名\(73\). \(A\)题其实过的有点莫名其妙...就是我感觉好像能找到一个反例(现在发现我的算法是对的... ...

  9. ubuntu 解决TXT文本的乱码的问题。

    windows 系统上编辑的 txt 文本,在ubuntu上出现 乱码,我是这样解决的 1.terminal上输入以下命令: gsettings set org.gnome.gedit.prefere ...

  10. OK6410移植linux3.3.1

    本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 首先修改资源代码,进入arch/arm/mach-s3c64xx/目录,在这里我们使用mini6410的资源配置 ...