iOS 动画笔记 (一)
你也肯定喜欢炫酷的动画!
在APP中,动画就是一个点睛之笔!可以给用户增加一些独特的体验感,估计也有许多的和我一样的,看着那些觉得不错的动画,也就只能流口水的孩子,毕竟可能不知道从哪里下手去写!动画学习的过程我会总结一个系列的出来,总结一下iOS中动画的一个学习的过程,以及当中出现的一些问题也会和大家分享。现总结几点在学习动画之前的知道的一些点,这些能帮助我们写好学好动画。
一:从这里 Quartz2D 开始
在我的学习过程中,我是先从 Quartz2D 开始学习的,它里面的贝塞尔曲线在我们创造精美的动画的过程中是必不可少的,Quartz 2D 它首先就是一个二维绘图引擎,同时支持iOS和Mac系统。下面这里一篇不错的文章,仔细的讲解了 Quartz 2D。想制作精美的动画,你就得懂Quartz 2D里面的贝塞尔曲线!你要仔细的学习了上面链接里面的内容,我想你也就掌握了 Quartz2D 了。
二: 接下来看看 CADisplayLink
就是这个 CADisplayLink,简单地说它就是一个定时器!定时器大家最熟悉的可能就是 NSTime了吧,那 CADisplayLink 和 NStime 又有什么区别呢?带着这些疑问往下看。
CADisplayLink 是一个能让我们以和屏幕刷新率相同的频率将内容画到屏幕上的定时器。我们在应用中创建一个新的 CADisplayLink 对象,把它添加到一个runloop中,并给它提供一个 target 和 selector,它在屏幕刷新的时候调用, 一但 CADisplayLink 以特定的模式注册到runloop之后,每当屏幕需要刷新的时候,runloop就会调用CADisplayLink绑定的target上的selector,这时target可以读到 CADisplayLink 的每次调用的时间戳,用来准备下一帧显示需要的数据。例如一个视频应用使用时间戳来计算下一帧要显示的视频数据。在UI做动画的过程中,需要通过时间戳来计算UI对象在动画的下一帧要更新的大小等等。 NStime 的精确度就显得低了点,
它们还是有很大的区别的,这是我们博客园的伙伴总结的 定时器,写的很详细了,可以进去看看他们俩的区别。它们俩的创建看下面
// 创建 NSTimer 定时器
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(test) userInfo:nil repeats:YES];
// 停止定时器
[timer invalidate]; // 创建CADisplayLink 定时器
CADisplayLink *displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(test:)];
// 将创建的displaylink添加到runloop中,否则定时器不会执行
[displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
// 停止定时器
[displayLink invalidate];
displayLink = nil;
三:先说说系统的吧!
(1) CALayer 实际上UIView是对CALayer封装,在CALayer的基础上再添加交互功能。UIView的显示必须依赖于CALayer。我们同样可以跟新建view一样新建一个layer,然后添加到某个已有的layer上,同样可以对layer调整大小、位置、透明度等。 具体讲CAlayer的属性
(2) UIBezierPath (贝塞尔曲线)这里有具体讲到贝塞尔曲线!
(3) CAAnimation (重点)
首先 CAAnimation 可以分为以下几类:
- CABasicAnimation
基础动画,通过设定起始点,终点,时间,动画会沿着你这设定点进行移动。可以看做特殊的CAKeyFrameAnimation - CAKeyframeAnimation
关键帧动画,可定制度比CABasicAnimation高,也是本系列的接下来的内容 - CAAnimationGroup
组动画,支持多个CABasicAnimation或者CAKeyframeAnimation动画同时执行
下面链接的文章能帮助大家很好的学习 CAAnimation!感谢作者!大家好好看看!
学完看看这个,经典的淘宝购物车效果:立即抢购图标会大致按照下面的贝塞尔曲线运动到购物车,完后消失,给大家附上大概的思路代码!代码写其实挺简单的,你完全可以试试!

-(void)buttonclick
{ // http://www.jianshu.com/p/69caa3b68b43/comments/1352880 CAlay 详解
layer = [[CALayer alloc]init];
layer.frame = imageV.frame;
// 包含的内容
layer.contents = (__bridge id _Nullable)(imageV.image.CGImage);
// 透明度
layer.opacity = 1;
[self.view.layer addSublayer:layer]; // 起点和终点
CGPoint starpoint = imageV.center;
CGPoint stoppoint = CGPointMake(self.view.bounds.size.width - 50, 300); // 贝塞尔曲线
// http://www.jianshu.com/p/734b34e82135 贝塞尔曲线详解
UIBezierPath * path = [UIBezierPath bezierPath];
// 曲线的开始位置
[path moveToPoint:starpoint];
// 控制点
CGPoint coltrolpoint = CGPointMake(starpoint.x + (stoppoint.x - starpoint.x)/3, 0);
// 添加二维曲线
[path addQuadCurveToPoint:stoppoint controlPoint:coltrolpoint]; CAKeyframeAnimation * animation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
animation.path = path.CGPath; // CGPath CGPathRef类型
animation.removedOnCompletion = NO;
animation.fillMode = kCAFillModeForwards;
animation.delegate=self;
animation.duration = 0.8;
animation.autoreverses = NO;
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
[layer addAnimation:animation forKey:@"buy"]; }
-(void)animationDidStop:(CAKeyframeAnimation *)anim finished:(BOOL)flag
{
[layer removeFromSuperlayer];
}
四:能擦出火花
你要了解了上面说的贝塞尔曲线和CADisplayLink,它俩碰撞其实已经能擦出火花了!你要真的认真的学习我上面不管是我写的还是给大家链接里面我们的同行写的博客,我相信基本的动画大家其实已经也差不多够用了,关在在于你怎么样去灵活的用它。
最后在给大家一篇博客, CADisplayLink结合UIBezierPath的神奇妙用 就算是对上面只是的一个总结,这里面的动画都是有git源码的,你可以下载下来好好去研究研究!
我会在这个系列的下一篇给大家介绍常用的动画三方库FaceBook出品的 pop 和 Canvas !
2017-06-20 更新:
最近又翻出来在看转场动画的内容,感觉这篇真的值提到了一些动画的皮毛,很浅,下面是自己补充的知识点:
认真总结一下核心的CoreAnimation:
在理解CoreAnimation之前,必须也要理解UIView和CAlayer:
总接来说就是如下几点:
- 每个 UIView 内部都有一个 CALayer 在背后提供内容的绘制和显示,并且 UIView 的尺寸样式都由内部的 Layer 所提供。两者都有树状层级结构,layer 内部有 SubLayers,View 内部有 SubViews.但是 Layer 比 View 多了个AnchorPoint
- 在 View显示的时候,UIView 做为 Layer 的 CALayerDelegate,View 的显示内容由内部的 CALayer 的 display
- CALayer 是默认修改属性支持隐式动画的,在给 UIView 的 Layer 做动画的时候,View 作为 Layer 的代理,Layer 通过 actionForLayer:forKey:向 View请求相应的 action(动画行为)
- layer 内部维护着三分 layer tree,分别是 presentLayer Tree(动画树),modeLayer Tree(模型树), Render Tree (渲染树),在做 iOS动画的时候,我们修改动画的属性,在动画的其实是 Layer 的 presentLayer的属性值,而最终展示在界面上的其实是提供 View的modelLayer
- 两者最明显的区别是 View可以接受并处理事件,而 Layer 不可以
再看看这个同行总结的CoreAnimation的结构树状图,这个对理解它还是很重要很有用的:

说明:
一:
核心动画中所有类都遵守CAMediaTiming协议。
CAAnaimation是个抽象类,不具备动画效果,必须用它的子类才有动画效果。
二:
CAAnimationGroup和CATransition才有动画效果,CAAnimationGroup是个动画组,可以同时进行缩放,旋转(同时进行多个动画)。
CATransition是转场动画,界面之间跳转(切换)都可以用转场动画。
CAPropertyAnimation也是个抽象类,本身不具备动画效果,只有子类才有。
三:
CABasicAnimation和CAKeyframeAnimation:
CABasicAnimation基本动画,做一些简单效果。
CAKeyframeAnimation帧动画,做一些连续的流畅的动画。
总结学习连接:
iOS开发基础知识:Core Animation(核心动画)
感谢上面连接作者,有问题还是会持续更新内容!
iOS 动画笔记 (一)的更多相关文章
- iOS 动画笔记 (二)
有它们俩你就够了! 说明:下面有些概念我说的不怎么详细,网上实在是太多了,说了我觉得也意义不大了!但链接都给大家了,可以自己去看,重点梳理学习写动画的一个过程和一些好的博客! 一:说说这两个三方库,C ...
- iOS学习笔记10-UIView动画
上次学习了iOS学习笔记09-核心动画CoreAnimation,这次继续学习动画,上次使用的CoreAnimation很多人感觉使用起来很繁琐,有没有更加方便的动画效果实现呢?答案是有的,那就是UI ...
- iOS开发笔记7:Text、UI交互细节、两个动画效果等
Text主要总结UILabel.UITextField.UITextView.UIMenuController以及UIWebView/WKWebView相关的一些问题. UI细节主要总结界面交互开发中 ...
- iOS学习笔记-自定义过渡动画
代码地址如下:http://www.demodashi.com/demo/11678.html 这篇笔记翻译自raywenderlick网站的过渡动画的一篇文章,原文用的swift,由于考虑到swif ...
- ios 动画效果CATransition笔记
初学ios开发,很多概念还不清楚,所以只有边学边做例子.又怕学了后面忘了前面,因此用自己的博客来纪录自己的学习历程,也是对自己学习不要懈怠做个监督. 刚学ios做动画效果.因为ios封装得很好,实现i ...
- iOS学习笔记-精华整理
iOS学习笔记总结整理 一.内存管理情况 1- autorelease,当用户的代码在持续运行时,自动释放池是不会被销毁的,这段时间内用户可以安全地使用自动释放的对象.当用户的代码运行告一段 落,开始 ...
- iOS学习笔记总结整理
来源:http://mobile.51cto.com/iphone-386851_all.htm 学习IOS开发这对于一个初学者来说,是一件非常挠头的事情.其实学习IOS开发无外乎平时的积累与总结.下 ...
- ios 动画学习的套路 (二)
有它们俩你就够了! 说明:下面有些概念我说的不怎么详细,网上实在是太多了,说了我觉得也意义不大了!但链接都给大家了,可以自己去看,重点梳理学习写动画的一个过程和一些好的博客! (一) 说说这两个三方库 ...
- iOS回顾笔记(05) -- 手把手教你封装一个广告轮播图框架
html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...
随机推荐
- Markdowm语法学习
Markdowm语法学习 标题 一级标题 一级标题 #一级标题 二级标题 二级标题 ##二级标题 六级标题 六级标题 ######六级标题 引用 引用 >引用 代码块 if(i == 0) { ...
- 《鸟哥的Linux私房菜》学习笔记(8)——bash脚本编程之变量
一.变量命名 1.只能包含字母.数字和下划线,并且不能以数字开头, 2.不 ...
- Python 频繁请求问题: [Errno 104] Connection reset by peer
Table of Contents 1. 记遇到的一个问题:[Errno 104] Connection reset by peer 记遇到的一个问题:[Errno 104] Connection r ...
- IOS开发---菜鸟学习之路--(一)
PS(废话): 看了那么多的博客文章,发现大部分人都一直在强调写技术博客的重要性,索性自己也耐着性子写写看吧. 写博客的重要性之类的说明,我就不做复制黏贴的工作了.因为自己没有写过多少,所也不清楚是不 ...
- ios开发学习笔记003-流程控制和类型转换
流程控制 顺序结构.选择结构.循环结构 1.顺序结构 程序默认是顺序执行的. 2.选择结构 if选择语句 第一种情况 if(条件)//条件成立执行下面语句 { //语句 } 第二种情况 if(条件)/ ...
- sql注入语句大全
sql注入语句大全--是否存在xp_cmdshell and 1=(select count(*) from master.dbo.sysobjects where xtype = 'x' and n ...
- python实现算法: 多边形游戏 数塔问题 0-1背包问题 快速排序
去年的算法课挂了,本学期要重考,最近要在这方面下点功夫啦! 1.多边形游戏-动态规划 问题描述: 多边形游戏是一个单人玩的游戏,开始时有一个由n个顶点构成的多边形.每个顶点被赋予一个整数值, 每条边被 ...
- Solr配置Ikanalyzer分词器
上一篇文章讲解在win系统中如何安装solr并创建一个名为test_core的Core,接下为text_core配置Ikanalyzer 分词器 1.打开text_core的instanceDir目录 ...
- Block Nested-Loop 和 Batched Key Access
官方文档:https://dev.mysql.com/doc/refman/5.7/en/bnl-bka-optimization.html BNL和BKA是MySQL 表关联的两种关联算法 比如t1 ...
- 解决云服务器ECS,windows server 2012不能安装SQL Server 2012,不能安装.NET Fromework 3.5
在云服务器上安装SQL Server 2012 时出现“启用windows功能NetFx3时出错”的问题:NetFx3指的是.NET Framework 3.5,SQL Server 2012数据库系 ...