概述

在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. android widget->progressbar

    其中的indeterminteDrawable属性就是用来设置进度条颜色等属性的

  2. Repeated meta-data items

    B.2 Generating your own meta-data using the annotation processor You can easily generate your own co ...

  3. C11 memory_order

    概念: 摘录自:http://preshing.com/20120913/acquire-and-release-semantics/ Acquire semantics is a property ...

  4. android之存储篇_存储方式总览

    作为一个完成的应用程序,数据存储操作是必不可少的.因此,Android系统一共提供了四种数据存储方式.分别是:SharePreference.SQLite.Content Provider和File. ...

  5. 解决Mac OS Adobe Flash Builder 4.7 java heap space 问题【转】

    1. 在Finder中打开Adobe Flash Builder 4.7的安装目录 2. 在Adobe Flash Builder 4.7.app上点击右键“Show Package contents ...

  6. sql server中将一个表中的部分数据插入到另一个表中

    可以通过存储过程完成,也可以通过在库名上右击“新建查询”执行.语句其实基本相同. 1. 存储过程: CREATE PROCEDURE pro1 as insert into tableB (field ...

  7. huffman 编码

    huffman压缩是一种压缩算法,其中经典的部分就是根据字符出现的频率建立huffman树,然后根据huffman树的构建结果标示每个字符.huffman编码也称为前缀编码,就是每个字符的表示形式不是 ...

  8. 20个热门jQuery的提示和技巧

    以下是一些非常有用的jQuery提示和所有jQuery的开发技巧. 1.优化性能复杂的选择 查询DOM中的一个子集,使用复杂的选择时,大幅提高了性能: var subset = $("&qu ...

  9. Oracle存储过程 使用游标、数组的配合查询

    查询输入的门牌号码是否在标准门牌库中存在.存在则返回相应的号码. public string GetValidate(){ OracleConnection conn = ConnectOra(); ...

  10. SQLServer 2012 已成功与服务器建立连接,但是在登录前的握手期间发生错误。 (provider: SSL Provider, error: 0 - 等待的操作过时。

    楼主用SQL Server 2012 在连接其他电脑的实例时,一直提示“已成功与服务器建立连接,但是在登录前的握手期间发生错误. (provider: SSL Provider, error: 0 - ...