CoreAnimation的使用小结

参考:

http://www.cnblogs.com/wendingding/p/3801157.htmlhttp://www.cnblogs.com/wendingding/p/3802830.html

切记动画的执行,是必须要按你想点击后操作开始执行的,如果是想push,那么就在其前做好动画,如果是要点击事件执行动画,就要在点击事件中添加要达到的效果。

执行动画,就是将要修改的属性封装到动画中去执行

CAAnimation是根据CALayer进行处理操作的;

当[layer addAnimation:anim forKey:@“”]; 执行后,动画就开始执行了,所以要在其中添加将要达到的效果即可。

对于 基本动画,如果是结构体需要使用NSValue进行转换,但如果不是就可以直接使用,记得要转成id类型,可使用 @(); 这种方式来转换。

所有的CAAnimation对象实现这个CAAction协议,并且当一个图层属性发生改变时,这个动画便会执行。动画属性是动作的一种类型,你可以用几乎所有你想用的动作类型去定义一个动作。然后你需要去定义一个动作对象,然后将其与你的app图层连接起来。

核心动画都是针对图层来说的,Core Animation的动画执行过程都是在后台操作的,不会阻塞主线程。要注意的是, Core Animation是直接作用在CALayer上的,并非UIView。

Core Animation的使用步骤:

1. 使用它需要先添加QuartzCore.framework框架和引入主头文件<QuartzCore/QuartzCore.h>(iOS7不需要)

2. 初始化一个CAAnimation对象,并设置一些动画相关属性,添加图层想要达到的动画后的结果

3. 通过调用CALayer的addAnimation:forKey:方法增加CAAnimation对象到CALayer中,这样就能开始执行动画了(此方法进行动画的触发)

4. 通过调用CALayer的removeAnimationForKey:方法可以停止CALayer中的动画

CATransition

type的常见量值:

/* 过渡效果

fade     //交叉淡化过渡(不支持过渡方向) kCATransitionFade

push     //新视图把旧视图推出去  kCATransitionPush

moveIn   //新视图移到旧视图上面   kCATransitionMoveIn

reveal   //将旧视图移开,显示下面的新视图  kCATransitionReveal

cube     //立方体翻滚效果

oglFlip  //上下左右翻转效果

suckEffect   //收缩效果,如一块布被抽走(不支持过渡方向)

rippleEffect //滴水效果(不支持过渡方向)

pageCurl     //向上翻页效果

pageUnCurl   //向下翻页效果

cameraIrisHollowOpen  //相机镜头打开效果(不支持过渡方向)

cameraIrisHollowClose //相机镜头关上效果(不支持过渡方向)

*/

/*

subtype过渡方向

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;

/*******中间穿插改变layer属性的代码**********/                                                  #重要不可错位

[layer addAnimation:anim forKey:nil];

CAAnimation是所有动画类的父亲,但是它不能直接使用,应该使用其子类。

常见的子类有:

CAMediaTiming(一个协议不能直接使用)

CAAnimation:

CAPropertyAnimation:(不能直接使用,使用其子类)

CABasicAnimation(可以)

CAKeyframeAnimation(可以)

CATransition(可以)

CAAnimationGroup(可以)

(同一颜色代表同一层级)

说明:1 > 能用的动画类只有4个子类:CABasicAnimation、CAKeyframeAnimation、CATransition、CAAnimationGroup

2 > CAMediaTiming是一个协议(protocol)

CAPropertyAnimation是CAAnimation的子类,但是不能直接使用,要想创建动画对象,应该使用它的两个子类:CABasicAnimation和CAKeyframeAnimation

它有个NSString类型的keyPath属性, 可通过指定CALayer的某个属性名为keyPath,并对比CALayer的这个属性的值进行修改,达到相应的动画效果。比如:指定@“position”为keyPath,就是修改CALayer的position属性的值,以达到平移的动画效果

常见的属性有:

duration:动画的持续时间

repeatCount:动画的重复次数

timingFunction:控制动画运行的节奏

补充:所有动画对象的父类,负责控制动画的持续时间和速度,是个抽象类,不能直接使用,应该使用它的具体子类:属性解析:(有>代表来自CAMediaTiming协议的属性)

> duration:动画的持续时间

> repeatCount:动画的重复次数

> repeatDuration:动画的重复时间

removedOnCompletion:默认为YES,代表动画执行完毕后就从图层上移除,图形会恢复到动画执行前的状态。如果想让图层保持显示动画执行后的状态,那就设置为NO,不过还要设置fillMode为kCAFillModeForwards

> fillMode:决定当前对象在非active时间段的行为。比如动画开始之前,动画结束之后。

> beginTime:可以用来设置动画延迟执行时间,若想延迟2s,就

设置为CACurrentMediaTime() + 2, CACurrentMediaTime()为图层当前的时间。

timingFunction:速度控制函数,控制动画运行的节奏

delegate:动画代理

如果想执行完成后保持最新的动态需要添加两个:

// 设置动画执行完毕后不删除动画

anim.removeOnCompletion = NO;

// 设置保存动画的最新状态

anim.fillMode = kCAFillModeForwards;

UIView封装的动画与CALayer动画的对比:

使用UIView和CALayer都能实现动画效果,但是在真实在开发中,一般还是主要使用UIView封装的动画,而很少使用CALayer的动画。

CALayer核心动画与UIView动画的区别:

UIView封装的动画执行完毕之后不会反弹,即如果是通过CALayer核心动画改变layer的位置状态,表面上看虽然已经改变了,但是实际上它的位置是没有改变的。(这个实际位置指的是什么东西,假象又是什么)

二、block动画

1.简单说明

+ (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

提示:self.customView.layer.position和self.customView.center等价,因为position的默认值为(0.5,0.5)。

三、补充

1.UIImageView的帧动画

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

相关属性解析:

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

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

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

相关方法解析:

- (void)startAnimating; 开始动画

- (void)stopAnimating;  停止动画

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

2.UIActivityIndicatorView

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

方法解析:

- (void)startAnimating; 开始动画

- (void)stopAnimating;  停止动画

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

UIActivityIndicatorViewStyle有3个值可供选择:

UIActivityIndicatorViewStyleWhiteLarge   //大型白色指示器

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

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-28 17:28:47

CoreAnimation的使用小结的相关文章

iOS性能优化小结

iOS性能优化分析 首先要熟悉几个概念 PNG 和 JPG 的区别是什么? png格式的图片有alpha通道,jpeg则没有.png无损压缩,jpeg允许你选择0-100%的压缩质量.如果需要alpha通道(透明),就只能用png格式. CPU 和 GPU 如果想看看两者的区别,先得了解iOS视图背后的层级结构原理  上图中的最底下一行是硬件层,由GPU和CPU组成. 我们经常说到的硬件加速其实是指OpenGL,Core Animation/UIKit基于GPU之上对计算机图形合成以及绘制的实现

使用Apache POI导出Excel小结--导出XLS格式文档

使用Apache POI导出Excel小结 关于使用Apache POI导出Excel我大概会分三篇文章去写 使用Apache POI导出Excel小结--导出XLS格式文档 使用Apache POI导出Excel小结--导出XLSX格式文档 使用Apache POI导出Excel--大数量导出 导出XLS格式文档 做企业应用项目难免会有数据导出到Excel的需求,最近在使用其,并对导出Excel封装成工具类开放出来供大家参考.关于Apache POI Excel基本的概念与操作我在这里就不啰嗦

【转载】小结一下linux 2.6内核的四种IO调度算法

在LINUX 2.6中,有四种关于IO的调度算法,下面综合小结一下: 1) NOOP NOOP算法的全写为No Operation.该算法实现了最最简单的FIFO队列,所有IO请求大致按照先来后到的顺序进行操作.之所以说“大致”,原因是NOOP在FIFO的基础上还做了相邻IO请求的合并,并不是完完全全按照先进先出的规则满足IO请求.NOOP假定I/O请求由驱动程序或者设备做了优化或者重排了顺序(就像一个智能控制器完成的工作那样).在有些SAN环境下,这个选择可能是最好选择.Noop 对于 IO

Android基础入门教程——8.1.3 Android中的13种Drawable小结 Part 3

Android基础入门教程--8.1.3 Android中的13种Drawable小结 Part 3 标签(空格分隔): Android基础入门教程 本节引言: 本节我们来把剩下的四种Drawable也学完,他们分别是: LayerDrawable,TransitionDrawable,LevelListDrawable和StateListDrawable, 依旧贴下13种Drawable的导图: 1.LayerDrawable 层图形对象,包含一个Drawable数组,然后按照数组对应的顺序来

Android基础入门教程——8.1.2 Android中的13种Drawable小结 Part 2

Android基础入门教程--8.1.2 Android中的13种Drawable小结 Part 2 标签(空格分隔): Android基础入门教程 本节引言: 本节我们继续来学习Android中的Drawable资源,上一节我们学习了: ColorDrawable:NinePatchDrawable: ShapeDrawable:GradientDrawable!这四个Drawable~ 而本节我们继续来学习接下来的五个Drawable,他们分别是: BitmapDrawable:Insert

安卓小结《1》

Activity的生命周期和启动模式的知识点小结: 1.如果Activity切换的时候,新Activity是透明,旧的不会走onStop方法. 2.新的Activity切换的时候,旧Activity  会先执行,onpause,然后才会启动新的activity. 3. Activity在异常情况下被回收时,onSaveInstanceState方法会被回调,回调时机是在onStop之前,当Activity被重新创建的时 候,onRestoreInstanceState方法会被回调,时序在onSt

date命令小结

在写linux shell脚本时,date是经常要用到的一个命令,这篇文章就此做个小结,以防自己用到时到处找 1.最基本的,显示当前的具体时期:直接敲入 date即可,如下, [email protected]:~/scripts$ date 2015年 01月 03日 星期六 21:46:49 CST 2.显示某个文件上次修改的时间:date -r file [email protected]:~/scripts$ date -r save.sh 2015年 01月 02日 星期五 23:29

java 小结2 多态问题。

面向对象这个东西,其实我们一直是不是都没有感觉到自己在用,以后我一定要用用.以前学c#时候认真的看过一次,最近一直研究java.随便再看看. 多态问题: 在java中多态分为(1)编译时多态和(2)运行时多态 (1)编译时多态比较容易理解:其实就是通过方法重载,就是方法的重载,同一个函数名但是可以参数不一样.这就是重载(so easy) (2)运行时多态:这个是通过方法覆盖实现的,就是子类在继承父类的时候,通过对某个方法的重写,覆盖父类方法. 简单的说:比如我们有个父类A,子类B通过Extend

php操作xml小结

<?php #php操作xml,SimpleXMLElement类小结 header('Content-type:text/html;charset=utf-8;'); //1.构造函数 /* $xmlstring=<<<XML <?xml version="1.0" encoding="utf-8"?> <note  xmlns:b="http://www.w3school.com.cn/example/&quo