概述

在IOS开发中,实现动画操作的地方有很多,典型的是在视图控制器的segue操作时。在同一个视图控制器类中,加载切换不同的视图时,也需要动画效果,还有一些视图对象有动画效果会更好。

插一句,在IOS开发过程中,感觉自己就像一个导演在工作,安排不同的布景,不同的画面切换。应用有了流畅的画面,会增色不少。

在storyboard中创建视图和视图控制器时,会有一些动画设置。但在代码角度上,我们还是需要理解一下这个动画设置的实现过程。

动画实现在不同的视图控制器切换操作时如presentViewController或popViewController时,使用的是CATransition。

CATransition其实也是基于layer的实现,用于切换不同的视图,但它能实现的效果有限。例如,不能满足两个视图控制器的视图在一个windows上展现的动画。我是想使用panGestureController实现来自于两个视图控制器的视图动画显示效果,这点很遗憾。

在同一视图控制器上的不同视图的动画切换,可以使用UIView 的beginAnimations:nil 或animateWithDuration:animations:completion:等方法来实现。

动画实现也就是通过修改视图一些属性,在设定时间能反复或逐步完成这些修改操作,达到动画展现的效果。

这些属性如下所示:

1.frame,bounds,center//改变View的frame属性

2.alpha //改变透明度

3.backgroundColor//改变背景颜色

4.contentStretch//拉伸变化

5.transform//仿射变换,其中又包括Rotate,Invert,Translate,Scale(旋转,反转,位移,缩放)

普通的动画都是30帧每秒,肉眼能识别的是24帧每秒,而在游戏上会要求是60帧每秒。

这些视图就是在设置的时间内,根据时间函数如缓入、缓出等,修改它的这些属性。修改一次,变成一个,周而复始。在我们肉眼看来,这就是一个连续的动作,就是动画。

这里说到UIView的属性,就不能不说它的组成。UIView其实是由layer组成的。UIView的这些属性如bounds,center都是来自于CALayer的对象。

在视图的layer上,将CAAnimation的对象添加进来就能实现视图的动画效果。CAAnimation是一个抽象类,它的实体类有CABasicAnimation 和CAKeyframeAnimation 。

通过CABasicAnimation或CAKeyframeAnimation 对象的定义,将它加入到UIView.layer中去,实现动画效果。注意,动画完成后,layer的属性定义又恢复到初始值。如果要保存动画结果,那么需要在添加动画到layer时做约定设置。

例如,在一个视图中加一个UIImage对象,声明一个CALayer的图层对象,将该图层的contents设置为UIImage对象的CGImage,然后在这个图层对象做处理。

首先,声明一个CABasicAnimation的对象scaleAnimation的keyPath为transform.scale。

CABasicAnimation *scaleAnimation = [CABasicAnimationanimationWithKeyPath:@"transform.scale"];

然后,设置keyPath的值,动画执行时间,动画执行时间函数。如果需要在动画结束后将结果保存下来,则需要在delegate的方法- (void)animationDidStop:(CAAnimation*)theAnimation finished:(BOOL)flag中去实现。

scaleAnimation.toValue =scaleFactor;

scaleAnimation.duration =3.0f;

scaleAnimation.timingFunction= [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];

最后,将CABasicAnimation的对象scaleAnimation加到图层中去,剩下就由IOS自己去实现,代码上就到这一步了。

[self.view.layeraddSublayer:logoLayer];

详细的代码如下

- (void)viewDidLoad {

[super viewDidLoad];

self.view.backgroundColor =[UIColor blackColor];

self.title = [[self class]displayName];

UIImage *image = [UIImageimageNamed:@"batman.png"];

logoLayer = [CALayer layer];

logoLayer.bounds =CGRectMake(0, 0, image.size.width, image.size.height);

logoLayer.position =CGPointMake(160, 180);

logoLayer.contents =(id)image.CGImage;

// Add layer as a sublayerof the UIView's layer

[self.view.layeraddSublayer:logoLayer];

}

- (void)scaleByFactor:(CGFloat)factor {

CABasicAnimation*scaleAnimation = [CABasicAnimationanimationWithKeyPath:@"transform.scale"];

NSNumber *scaleFactor =[NSNumber numberWithFloat:factor];

scaleAnimation.toValue =scaleFactor;

scaleAnimation.duration =3.0f;

scaleAnimation.timingFunction= [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];

// Set the model layer'sproperty so the animation sticks at the 'toValue' state

[logoLayer addAnimation:scaleAnimationforKey:@"transformAnimation"];

}

这里动画效果还只是针对一个视图对象的,如果需要多个视图同时操作,则需要实现动画联动,也就是CAAnimationGroup。将多个CABasicAnimation对象就加到一个数组中,再将这个数组设置到CAAnimationGroup的对象中,最后将CAAnimationGroup的对象加到图层的动画属性中。

CAAnimationGroup*animationGroup = [CAAnimationGroup animation];

animationGroup.duration =2.0f;

animationGroup.autoreverses= YES;

animationGroup.repeatCount =HUGE_VALF;

[animationGroupsetAnimations:[NSArray arrayWithObjects:rotationAnimation, scaleAnimation,nil]];

[logoLayeraddAnimation:animationGroup forKey:@"animationGroup"];

如果需要在图层上更精细的设置,那么需要CALayer上做扩展,形成各种各样的子类。

CALayer的子类有:

1)  CAScrollLayer,用于简化显示层的一部分

2)  CATextLayer,便于从字符串生成内容是文本的层

3)  CATiledLayer,可用于显示复杂的图片

4)  CAOpenGLLayer,提供OpenGLES渲染环境

CALayer能够对 UIView 做许多设定,如:阴影、边框、圆角和透明效果等,且这些设定都是很有用的。它的重要属性如下。

1. shadowPath :设置 CALayer 背景(shodow)的位置

2. shadowOffset :shadow 在 X 和 Y 轴 上延伸的方向,即shadow 的大小

3. shadowOpacity: shadow 的透明效果

4. shadowRadius :shadow 的渐变距离,从外围开始,往里渐变 shadowRadius 距离

5. masksToBounds: 很重要的属性,可以用此属性来防止子元素大小溢出父元素,如若防止溢出,请设为 true

6.borderWidth 和 boarderColor : 边框颜色和宽度,很常用

7. bounds :对于我来说比较难的一个属性,测了半天也没完全了解,只知道可以用来控制UIView 的大小,但是不能控制 位置

8. opacity :UIView 的透明效果

9. cornerRadius :UIView 的圆角

这些属性和UIView的属性很像,可以实现UIView实现不了的效果。

其实,我觉得UIKIT中声明的那么组件如UITextfield,uilable,uibutton,其实就是UIView的扩展,封装好了方便使用而已。

总结

在IOS中动画效果从layer层开始,向layer中添加CABasicAnimation对象,实际上就是layer中有一个预定义的功能,在视图viewDidAppear后就会执行这个功能点。

可能是因为CABasicAnimation稍微复杂点,IOS又封装出来一个类CATransition,它实现的功能有限,一些基本的动画操作如

可能是从方便使用的角度考虑,IOS又对UIView做了可做,有了beginAnimations:nil或animateWithDuration:animations:completion:等方法,可更方便地实现一些动画效果。

但是,如果要实现复杂的,更吸引人的动画,还需要在CALayer上下功夫。

iOS动画技术笔记的更多相关文章

  1. iOS 动画类型 笔记

    #pragma mark Core Animation - (IBAction)buttonPressed1:(id)sender { UIButton *button = (UIButton *)s ...

  2. 《逐梦旅程 WINDOWS游戏编程之从零开始》笔记2——透明贴图,动画技术

    第5章 透明贴图 像这样直接贴图会产生这种情况,所以我们需要透明贴图. 透明遮罩法:主要利用BitBlt函数中Raser(光栅)值的运算,需要准备素材图和遮罩图: 这个方法的原理解释见书131页. 示 ...

  3. iOS 动画笔记 (二)

    有它们俩你就够了! 说明:下面有些概念我说的不怎么详细,网上实在是太多了,说了我觉得也意义不大了!但链接都给大家了,可以自己去看,重点梳理学习写动画的一个过程和一些好的博客! 一:说说这两个三方库,C ...

  4. ios 动画效果CATransition笔记

    初学ios开发,很多概念还不清楚,所以只有边学边做例子.又怕学了后面忘了前面,因此用自己的博客来纪录自己的学习历程,也是对自己学习不要懈怠做个监督. 刚学ios做动画效果.因为ios封装得很好,实现i ...

  5. iOS 动画笔记 (一)

    你也肯定喜欢炫酷的动画! 在APP中,动画就是一个点睛之笔!可以给用户增加一些独特的体验感,估计也有许多的和我一样的,看着那些觉得不错的动画,也就只能流口水的孩子,毕竟可能不知道从哪里下手去写!动画学 ...

  6. ios面试技术要点

    iOS面试 技术总结点(可参考):多线程 运行时 runloop app框架 几种动画编程 jsonmodel原理 sdwebimage原理 masonry怎么应用及原理 应用框架有哪些 说一下Fac ...

  7. (转)iOS动画Core Animation

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

  8. ios 动画学习的套路 (二)

    有它们俩你就够了! 说明:下面有些概念我说的不怎么详细,网上实在是太多了,说了我觉得也意义不大了!但链接都给大家了,可以自己去看,重点梳理学习写动画的一个过程和一些好的博客! (一) 说说这两个三方库 ...

  9. IOS动画(Core Animation)总结 (参考多方文章)

    一.简介 iOS 动画主要是指Core Animation框架.官方使用文档地址为:Core Animation Guide. Core Animation是IOS和OS X平台上负责图形渲染与动画的 ...

随机推荐

  1. C语言的本质(21)——预处理之三:其它预处理特性及总结

    C标准规定了几个特殊的宏,在不同的地方使用可以自动展开成不同的值,预编译程序对于在源程序中出现的这些串将用合适的值进行替换.这些宏有下面这些: __FILE__ 展开为当前源文件的文件名,是一个字符串 ...

  2. Mac 安装Qt5.1编译出现的错误解决

    错误提示: :-1: 错误:Xcode is not installed in /Volumes/Xcode/Xcode.app/Contents/Developer. Please use xcod ...

  3. 具体总结 Hive VS 传统关系型数据库

    本文思路,看图说话,一张图,清晰总结二者差别 以下对图中的各条做具体总结 1.查询语言 不做赘述 2.数据存储位置 不做赘述 3.数据格式 Hive:Hive 中未定义专门的数据格式,数据格式能够由用 ...

  4. Windows系统的安装

    一.写在前面        笔者最近因为换工作,在家待业甚感无聊,于是想要整理一些在Windows系统的一些安装方法和下载资源,一来给自己做个备忘,二来把一些不成熟的想法分享出去,希望大家予以指正. ...

  5. UVA 1599 Ideal Path

    题意: 给出n和m,n代表有n个城市.接下来m行,分别给出a,b,c.代表a与b之间有一条颜色为c的道路.求最少走几条道路才能从1走到n.输出要走的道路数和颜色.保证颜色的字典序最小. 分析: bfs ...

  6. C语言预处理指令

    C程序的源代码中可包括各种编译指令,这些指令称为预处理命令.虽然它们实际上不是C语言的一部分,但却扩展了C程序设计的环境.本节将介绍如何应用预处理程序和注释简化程序开发过程,并提高程序的可读性.ANS ...

  7. Spring IOC的配置使用(转)

    转:http://www.cnblogs.com/linjiqin/p/3408306.html Spring IOC的配置使用 1.1.1 XML配置的结构一般配置文件结构如下: <beans ...

  8. 用GoEasy推送实现Java实时推送

    前段时间客户有个需求他希望他在后台管理页面发布一个消息,所有用这个系统的用户无论在哪个页面都能及时收到他发布的信息,以前对于类似需求在少量 页面接收的前提下,我一般采用ajax定时去服务器pull信息 ...

  9. js 完美兼容浏览器的复制功能

    1,js结合swf的复制功能,完美兼容火狐,谷歌,360,ie8,使用示例:(ps:引入copy.swf比较重要,文件传送门 解压密码:http://www.bieanju.com/,为了防止360删 ...

  10. 安装wxWidgets

    从官网可下载源码安装包.安装后,建立批处理文件对其进行编译: gvim bwx.bat 内容如下: @echo off set WXWIN=C:\wxWidgets-3.0.2 pushd %WXWI ...