你也肯定喜欢炫酷的动画!

在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!感谢作者!大家好好看看!

iOS动画(一)

iOS动画(二)

学完看看这个,经典的淘宝购物车效果:立即抢购图标会大致按照下面的贝塞尔曲线运动到购物车,完后消失,给大家附上大概的思路代码!代码写其实挺简单的,你完全可以试试!

-(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(核心动画)

详解CALayer 和 UIView的区别和联系

iOS动画学习总结

感谢上面连接作者,有问题还是会持续更新内容!

ios 学习动画的套路 (一)的更多相关文章

  1. iOS核心动画学习整理

    最近利用业余时间终于把iOS核心动画高级技巧(https://zsisme.gitbooks.io/ios-/content/chapter1/the-layer-tree.html)看完,对应其中一 ...

  2. iOS学习笔记10-UIView动画

    上次学习了iOS学习笔记09-核心动画CoreAnimation,这次继续学习动画,上次使用的CoreAnimation很多人感觉使用起来很繁琐,有没有更加方便的动画效果实现呢?答案是有的,那就是UI ...

  3. iOS学习——核心动画

    iOS学习——核心动画 1.什么是核心动画 Core Animation(核心动画)是一组功能强大.效果华丽的动画API,无论在iOS系统或者在你开发的App中,都有大量应用.核心动画所在的位置如下图 ...

  4. iOS学习——核心动画之Layer基础

    iOS学习——核心动画之Layer基础 1.CALayer是什么? CALayer我们又称它叫做层.在每个UIView内部都有一个layer这样一个属性,UIView之所以能够显示,就是因为它里面有这 ...

  5. iOS学习之自定义弹出UIPickerView或UIDatePicker(动画效果)

    前面iOS学习之UIPickerView控件的简单使用 用到的UIPickerView弹出来是通过 textField.inputView = selectPicker;   textField.in ...

  6. iOS学习笔记-自定义过渡动画

    代码地址如下:http://www.demodashi.com/demo/11678.html 这篇笔记翻译自raywenderlick网站的过渡动画的一篇文章,原文用的swift,由于考虑到swif ...

  7. IOS学习经验总结

    学习ios有一段时间了,感觉有些盲目.有些迷茫,从网上收集了一些比人的学习经验,来参考. IOS学习经验总结--来自知乎网友 转自知乎:http://www.zhihu.com/question/20 ...

  8. iOS学习笔记-自己动手写RESideMenu

    代码地址如下:http://www.demodashi.com/demo/11683.html 很多app都实现了类似RESideMenu的效果,RESideMenu是Github上面一个stars数 ...

  9. iOS app内存分析套路

    iOS app内存分析套路 Xcode下查看app内存使用情况有2中方法: Navigator导航栏中的Debug navigator中的Memory Instruments 一.Debug navi ...

随机推荐

  1. Scala中function的理解

    在函数式语言中,函数是和value一样地位的一等公民,他可以作为变量,或者作为参数传递给另一个函数 ##作为变量 val f=(x:Int)=>x+1 为啥可以这样写? 由于scala是OOP, ...

  2. ZOJ 3935 2016

    简单规律题...没看懂题目直接从输出中找到了规律. 先不管是不是闰年,前后两项的差值会形成一个等差数列,公差是64... 输出的时候再判一下闰年即可. #include<cstdio> # ...

  3. Crazyflie笔记五: CRTP 实时通信协议(一)(转)

    源:Crazyflie笔记五: CRTP 实时通信协议(一) 这里详细介绍了 Crazyflie 的 CRTP实时通信协议的相关内容,由于内容很长,分几篇博文来讲述.这里是第一节内容.欢迎交流:301 ...

  4. UIAlertController高级之嵌入其他控件

    在编码过程中,我们经常遇到需要这样一个效果,就是弹出框的嵌套; 举个最简单的例子,比如你要选择时间,必然需要一个时间选择器DatePicker.但是这个选择器又是在你点击某按钮时弹出,弹出方式最常见的 ...

  5. HTML CSS基础(二)

    块元素和行内元素 HTML元素根据表现形式,可以分为2类: (1)块元素(block): (2)行内元素(inline): 任何HTML元素都属于这两类中的其中一类. 2.块元素特点: (1)独占一行 ...

  6. UnitOfWork实战

    企业模式之Unit Of Work模式 在开始UnitOfWork模式之前有必要回顾下我们耳熟能详的Data Access Object(DAO)模式,即数据访问对象.DAO是一种简单的模式,我们构建 ...

  7. IOS 动画的两种方式

    方式一: [UIView animateWithDuration:1 animations:^{ //动画的内容 CGRect frame = CGRectMake([UIParam widthScr ...

  8. cocharan-Armitage trend test

    Cochran-Armitage trend test是我们常说的趋势卡方检验,一般是针对基因型的2*3列联表的.譬如说三种基因型,如果按照某一个allele来看,可以有0.1.2个拷贝,是有序的,我 ...

  9. Zepto.js-事件处理

    http://www.webdevs.cn/article/68.html     web开发网 事件 $.Event $.Event(type, [properties]) ⇒ event 创建并初 ...

  10. 2.14. 删除托管对象(Core Data 应用程序实践指南)

    删除托管对象,只要调用托管对象上下文的deleteObject 或 deleteObjects就可以了.同样,真正的删除,要在调用save:之后.