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. Web自动化

    # -*- coding:utf-8 -*- ''' Created on Oct 17, 2018 @author: SaShuangYiBing Comment: ''' from seleniu ...

  2. ArcGIS栅格影像怎么从WGS84地理坐标转成Xian80投影坐标

    事情是这样的,我下载了一个WGS84坐标系的影像图,需要加载到Xian80投影坐标系下,所以需要对影像图进行坐标系的转换 1.因为涉及到两个参考椭球的问题,首先需要计算七参数,如何计算七参数,请参考我 ...

  3. File类_构造函数

    File类:用来将文件或者文件夹封装成对象方便对文件或或文件夹的属性信息进行操作File对象可以作为参数传递给流的构造函数 import java.io.File; public class File ...

  4. Matplotlib常用绘图示例

    一.Matplotlib介绍 Matplotlib是一个Python的2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形.通过Matplotlib,开发者可以仅需要几行代码,便可 ...

  5. 面试被问http协议?这篇文章足够覆盖所有相关问题!

    http使用面向连接的TCP作为传输层协议.http本身无连接. 请求报文 CRLF是回车换行     方法为GET的请求报文     方法为POST的请求报文     方法 OPTIONS:这个方法 ...

  6. A - I Think I Need a Houseboat HDU - 1065(水题)

    题意:给你一个半圆,半圆以面积每年增加50平方英里的速度扩张.问(x, y)在多少年后被覆盖. 思路:emmm,其实最开始,还是打表的,因为每一年的半圆的半径可以算出来.啊啊啊啊,其实这个方法是可以的 ...

  7. 解惑 ["1", "2", "3"].map(parseInt) 为何返回[1,NaN,NaN]

    javascript中的parseInt与map函数都是常用的函数,可是 ["1", "2", "3"].map(parseInt) 为何返 ...

  8. esp8266(2) 智能配置

    http://www.arduino.cn/thread-46594-1-1.html http://blog.csdn.net/sadshen/article/details/47049129 ht ...

  9. python3 练习题(多级菜单)

    '''多级菜单需求:1.现有省/市/县3级结构,要求程序启动后,允许用户可依次选择进入各子菜单2.可在任意一级菜单返回上一级3.可以在任意一级菜单退出程序所需新知识点: 列表/字典'''menu = ...

  10. 图、dfs、bfs

    graphdfsbfs 1.clone graph2.copy list with random pointer3.topological sorting4.permutations5.subsets ...