文章目录

  • IOS 动画开发设计
    • 1.动画设计原理
      • 1.1 IOS 常用动画类库
        • 1.1.1 iOS 核心动画Core Animation
        • 1.1.2 iOS CALayer
        • 1.1.2 iOS UIView动画
          • 1.1.2.1 iOS UIView简单动画使用
          • 1.1.2.2 iOS UIView Spring动画
          • 1.1.2.3 iOS 关键帧动画KeyFrames
    • 2.模糊效果的使用
    • 3.使用 maskView 设计动画
    • 4.使用 Facebook 开源动画库 POP 实现真实衰减与弹簧动画
    • 5.用缓动函数模拟物理动画
    • 6.使用带粒子效果的 CAEmitterLayer
    • 7.iOS 中 CAGradientLayer 的使用
    • 8.iOS 中 CALayer 的使用
    • 9.iOS绘图API绘制线条文字几何图形

IOS 动画开发设计

1.动画设计原理

1.1 IOS 常用动画类库

1.1.1 iOS 核心动画Core Animation

Core Animation简介
Core Animation,中文翻译为核心动画,它是一组非常强大的动画处理API,使用它能做出非常炫丽的动画效果,而且往往是事半功倍。也就是说,使用少量的代码就可以实现非常强大的功能。
Core Animation可以用在Mac OS X和iOS平台。
Core Animation的动画执行过程都是在后台操作的,不会阻塞主线程。
要注意的是,Core Animation是直接作用在CALayer上的,并非UIView。
Core Animation的视频:WWDC大会Core Animation讲解

核心动画类继承结构:

如果是xcode5之前的版本,使用它需要先添加QuartzCore.framework和引入对应的框架<QuartzCore/QuartzCore.h>
开发步骤:
1.使用它需要先添加QuartzCore.framework框架和引入主头文件<QuartzCore/QuartzCore.h>
2.初始化一个CAAnimation对象,并设置一些动画相关属性
3.通过调用CALayer的addAnimation:forKey:方法增加CAAnimation对象到CALayer中,这样就能开始执行动画了
4.通过调用CALayer的removeAnimationForKey:方法可以停止CALayer中的动画

相关动画类介绍:

CAAnimation——所有动画对象的父类

/*
CAAnimation——所有动画对象的父类
是所有动画对象的父类,负责控制动画的持续时间和速度,是个抽象类,不能直接使用,应该使用它具体的子类
属性说明:(带*号代表来自CAMediaTiming协议的属性)*duration:动画的持续时间
*repeatCount:重复次数,无限循环可以设置HUGE_VALF或者MAXFLOAT
*repeatDuration:重复时间
removedOnCompletion:默认为YES,代表动画执行完毕后就从图层上移除,图形会恢复到动画执行前的状态。如果想让图层保持显示动画执行后的状态,那就设置为NO,不过还要设置fillMode为kCAFillModeForwards
*fillMode:决定当前对象在非active时间段的行为。比如动画开始之前或者动画结束之后
*beginTime:可以用来设置动画延迟执行时间,若想延迟2s,就设置为CACurrentMediaTime()+2,CACurrentMediaTime()为图层的当前时间
timingFunction:速度控制函数,控制动画运行的节奏
delegate:动画代理
*/

CAAnimation——动画填充模式

/*
CAAnimation——动画填充模式fillMode属性值(要想fillMode有效,最好设置removedOnCompletion = NO)
kCAFillModeRemoved 这个是默认值,也就是说当动画开始前和动画结束后,动画对layer都没有影响,动画结束后,layer会恢复到之前的状态
kCAFillModeForwards 当动画结束后,layer会一直保持着动画最后的状态
kCAFillModeBackwards 在动画开始前,只需要将动画加入了一个layer,layer便立即进入动画的初始状态并等待动画开始。
kCAFillModeBoth 这个其实就是上面两个的合成.动画加入后开始之前,layer便处于动画初始状态,动画结束后layer保持动画最后的状态
*/

CAAnimation——速度控制函数

/*
CAAnimation——速度控制函数
速度控制函数(CAMediaTimingFunction)kCAMediaTimingFunctionLinear(线性):匀速,给你一个相对静态的感觉
kCAMediaTimingFunctionEaseIn(渐进):动画缓慢进入,然后加速离开
kCAMediaTimingFunctionEaseOut(渐出):动画全速进入,然后减速的到达目的地
kCAMediaTimingFunctionEaseInEaseOut(渐进渐出):动画缓慢的进入,中间加速,然后减速的到达目的地。这个是默认的动画行为。设置动画的执行节奏
anim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
*/

CAPropertyAnimation

/*
CAPropertyAnimation
是CAAnimation的子类,也是个抽象类,要想创建动画对象,应该使用它的两个子类:
CABasicAnimation
CAKeyframeAnimation
属性说明:
keyPath:通过指定CALayer的一个属性名称为keyPath(NSString类型),并且对CALayer的这个属性的值进行修改,达到相应的动画效果。比如,指定@“position”为keyPath,就修改CALayer的position属性的值,以达到平移的动画效果
*/

CABasicAnimation——基本动画

/*
CABasicAnimation——基本动画
基本动画,是CAPropertyAnimation的子类
属性说明:
keyPath:要改变的属性名称(传字符串)
fromValue:keyPath相应属性的初始值
toValue:keyPath相应属性的结束值
动画过程说明:
随着动画的进行,在长度为duration的持续时间内,keyPath相应属性的值从fromValue渐渐地变为toValue
keyPath内容是CALayer的可动画Animatable属性
如果fillMode=kCAFillModeForwards同时removedOnComletion=NO,那么在动画执行完毕后,图层会保持显示动画执行后的状态。但在实质上,图层的属性值还是动画执行前的初始值,并没有真正被改变。
*/

CABasicAnimation创建动画

//创建动画CABasicAnimation *anim = [CABasicAnimation animation];;//    设置动画对象keyPath决定了执行怎样的动画,调用layer的哪个属性来执行动画position:平移anim.keyPath = @"position";//    包装成对象anim.fromValue = [NSValue valueWithCGPoint:CGPointMake(0, 0)];;anim.toValue = [NSValue valueWithCGPoint:CGPointMake(200, 300)];anim.duration = 2.0;//    让图层保持动画执行完毕后的状态//    执行完毕以后不要删除动画anim.removedOnCompletion = NO;//    保持最新的状态anim.fillMode = kCAFillModeForwards;//    添加动画[self.layer addAnimation:anim forKey:nil];
1.1.2 iOS CALayer

在iOS系统中,你能看得见摸得着的东西基本上都是UIView,比如一个按钮、一个文本标签、一个文本输入框、一个图标等等,这些都是UIView。
其实UIView之所以能显示在屏幕上,完全是因为它内部的一个层。
在创建UIView对象时,UIView内部会自动创建一个层(即CALayer对象),通过UIView的layer属性可以访问这个层。当UIView需要显示到屏幕上时,会调用drawRect:方法进行绘图,并且会将所有内容绘制在自己的层上,绘图完毕后,系统会将层拷贝到屏幕上,于是就完成了UIView的显示。
换句话说,UIView本身不具备显示的功能,是它内部的层才有显示功能。
UIView之所以能够显示,完全是因为内部的CALayer对象。因此,通过操作这个CALayer对象,可以很方便地调整UIView的一些界面属性,比如:阴影、圆角大小、边框宽度和颜色等。

CALayer一些属性:

//下面是CALayer的一些属性介绍
//宽度和高度
@property CGRect bounds;
//位置(默认指中点,具体由anchorPoint决定)
@property CGPoint position;
//锚点(x,y的范围都是0-1),决定了position的含义
@property CGPoint anchorPoint;
//背景颜色(CGColorRef类型)
@propertyCGColorRefbackgroundColor;
//形变属性
@property CATransform3D transform;
//边框颜色(CGColorRef类型)
@property  CGColorRef  borderColor;
//边框宽度
@property CGFloat borderWidth;
//圆角半径
@property CGFloat cornerRadius;
//内容(比如设置为图片CGImageRef)
@property(retain) id contents;

说明:可以通过设置contents属性给UIView设置背景图片,注意必须是CGImage才能显示,我们可以在UIImage对象后面加上.CGImage直接转换,转换之后还需要在前面加上(id)进行强转。

// 跨框架赋值需要进行桥接
self.view.layer.contents = (__bridge id _Nullable)([UIImage imageNamed:@"123"].CGImage);

值得注意的是,UIView的CALayer对象(层)通过layer属性可以访问这个层。要注意的是,这个默认的层不允许重新创建,但可以往层里面添加子层。UIView可以通过addSubview:方法添加子视图,类似地,CALayer可以通过addSublayer:方法添加子层
CALayer对象有两个比较重要的属性,那就是position和anchorPoint。

position和anchorPoint属性都是CGPoint类型的
position可以用来设置CALayer在父层中的位置,它是以父层的左上角为坐标原点(0, 0)
anchorPoint称为"定位点",它决定着CALayer身上的哪个点会在position属性所指的位置。它的x、y取值范围都是0~1,默认值为(0.5, 0.5)
anchorPoint是视图的中心点,position是视图的位置,位置会和中心点重叠。所以我们在开发中可以通过修改视图的layer.anchorPoint或者layer.position实现特定的动画效果。

举例:创建一个CALayer,添加到控制器的view的layer中

CALayer *myLayer = [CALayer layer];
// 设置层的宽度和高度(100x100)
myLayer.bounds = CGRectMake(0, 0, 100, 100);
// 设置层的位置
myLayer.position = CGPointMake(100, 100);
// 设置层的背景颜色:红色
myLayer.backgroundColor = [UIColor redColor].CGColor;
// 添加myLayer到控制器的view的layer中
[self.view.layer addSublayer:myLayer];

隐式动画
根层与非根层:
每一个UIView内部都默认关联着一个CALayer,我们可用称这个Layer为Root Layer(根层)
所有的非Root Layer,也就是手动创建的CALayer对象,都存在着隐式动画
当对非Root Layer的部分属性进行修改时,默认会自动产生一些动画效果,而这些属性称为Animatable Properties(可动画属性)。
常见的几个可动画属性:

//bounds:用于设置CALayer的宽度和高度。修改这个属性会产生缩放动画
//backgroundColor:用于设置CALayer的背景色。修改这个属性会产生背景色的渐变动画
//position:用于设置CALayer的位置。修改这个属性会产生平移动画//可以通过事务关闭隐式动画:
[CATransaction begin];
// 关闭隐式动画
[CATransaction setDisableActions:YES];
self.myview.layer.position = CGPointMake(10, 10);
[CATransaction commit];
1.1.2 iOS UIView动画
1.1.2.1 iOS UIView简单动画使用

UIView动画是iOS开发中最廉价也是最常用的动画。
UIView动画能够设置的动画属性有:
frame,bounds,center, transform,alpha,backgroundColor,contentStretch
举例:

OC代码,简单动画设置

//开始动画:
// 第一个参数: 动画标识
// 第二个参数: 附加参数,在设置代理情况下,此参数将发送到setAnimationWillStartSelector和setAnimationDidStopSelector所指定的方法,大部分情况,设置为nil.
[UIView beginAnimations:(nullable NSString *) context:(nullable void *)];//结束动画
[UIView commitAnimations];//动画参数属性设置:
//动画持续时间
[UIView setAnimationDuration:(NSTimeInterval)];
//动画的代理对象
[UIView setAnimationDelegate:(nullable id)];
//设置动画将开始时代理对象执行的SEL
[UIView setAnimationWillStartSelector:(nullable SEL)];
//设置动画延迟执行的时间
[UIView setAnimationDelay:(NSTimeInterval)];
//设置动画的重复次数
[UIView setAnimationRepeatCount:(float)];
//设置动画的曲线
/*
UIViewAnimationCurve的枚举值:
UIViewAnimationCurveEaseInOut,         // 慢进慢出(默认值)
UIViewAnimationCurveEaseIn,            // 慢进
UIViewAnimationCurveEaseOut,           // 慢出
UIViewAnimationCurveLinear             // 匀速
*/
[UIView setAnimationCurve:(UIViewAnimationCurve)];
//设置是否从当前状态开始播放动画
/*假设上一个动画正在播放,且尚未播放完毕,我们将要进行一个新的动画:
当为YES时:动画将从上一个动画所在的状态开始播放
当为NO时:动画将从上一个动画所指定的最终状态开始播放(此时上一个动画马上结束)*/
[UIView setAnimationBeginsFromCurrentState:YES];
//设置动画是否继续执行相反的动画
[UIView setAnimationRepeatAutoreverses:(BOOL)];
//是否禁用动画效果(对象属性依然会被改变,只是没有动画效果)
[UIView setAnimationsEnabled:(BOOL)];
//设置视图的过渡效果
/* 第一个参数:UIViewAnimationTransition的枚举值如下UIViewAnimationTransitionNone,              //不使用动画UIViewAnimationTransitionFlipFromLeft,      //从左向右旋转翻页UIViewAnimationTransitionFlipFromRight,     //从右向左旋转翻页UIViewAnimationTransitionCurlUp,            //从下往上卷曲翻页UIViewAnimationTransitionCurlDown,          //从上往下卷曲翻页第二个参数:需要过渡效果的View第三个参数:是否使用视图缓存,YES:视图在开始和结束时渲染一次;NO:视图在每一帧都渲染*/
[UIView setAnimationTransition:(UIViewAnimationTransition) forView:(nonnull UIView *) cache:(BOOL)];

block块设置UIView基本动画:

[UIView animateWithDuration:(NSTimeInterval)  //动画持续时间animations:^{//执行的动画}];
//带有动画提交回调的Block动画
[UIView animateWithDuration:(NSTimeInterval)  //动画持续时间animations:^{//执行的动画}                completion:^(BOOL finished) {//动画执行提交后的操作}];//可以设置延时时间和过渡效果的Block动画
[UIView animateWithDuration:(NSTimeInterval) //动画持续时间delay:(NSTimeInterval) //动画延迟执行的时间options:(UIViewAnimationOptions) //动画的过渡效果animations:^{//执行的动画}                completion:^(BOOL finished) {//动画执行提交后的操作}];
1.1.2.2 iOS UIView Spring动画

ios7.0以后新增了Spring动画(IOS系统动画大部分采用Spring Animation, 适用所有可被添加动画效果的属性)
举例:

[UIView animateWithDuration:(NSTimeInterval)//动画持续时间delay:(NSTimeInterval)//动画延迟执行的时间usingSpringWithDamping:(CGFloat)//震动效果,范围0~1,数值越小震动效果越明显initialSpringVelocity:(CGFloat)//初始速度,数值越大初始速度越快options:(UIViewAnimationOptions)//动画的过渡效果animations:^{//执行的动画}completion:^(BOOL finished) {//动画执行提交后的操作}];
1.1.2.3 iOS 关键帧动画KeyFrames

举例

//IOS7.0后新增了关键帧动画,支持属性关键帧,不支持路径关键帧[UIView animateKeyframesWithDuration:(NSTimeInterval)//动画持续时间delay:(NSTimeInterval)//动画延迟执行的时间options:(UIViewKeyframeAnimationOptions)//动画的过渡效果animations:^{//执行的关键帧动画}completion:^(BOOL finished) {//动画执行提交后的操作}];//常用属性枚举值:
//UIViewKeyframeAnimationOptions的枚举值如下,可组合使用:
UIViewAnimationOptionLayoutSubviews           //进行动画时布局子控件
UIViewAnimationOptionAllowUserInteraction     //进行动画时允许用户交互
UIViewAnimationOptionBeginFromCurrentState    //从当前状态开始动画
UIViewAnimationOptionRepeat                   //无限重复执行动画
UIViewAnimationOptionAutoreverse              //执行动画回路
UIViewAnimationOptionOverrideInheritedDuration //忽略嵌套动画的执行时间设置
UIViewAnimationOptionOverrideInheritedOptions //不继承父动画设置
UIViewKeyframeAnimationOptionCalculationModeLinear     //运算模式 :连续
UIViewKeyframeAnimationOptionCalculationModeDiscrete   //运算模式 :离散
UIViewKeyframeAnimationOptionCalculationModePaced      //运算模式 :均匀执行
UIViewKeyframeAnimationOptionCalculationModeCubic      //运算模式 :平滑
UIViewKeyframeAnimationOptionCalculationModeCubicPaced //运算模式 :平滑均匀
  1. 增加关键帧方法:
[UIView addKeyframeWithRelativeStartTime:(double)//动画开始的时间(占总时间的比例)relativeDuration:(double) //动画持续时间(占总时间的比例)animations:^{//执行的动画}];
  1. 转场动画:

//从旧视图到新视图的动画效果
[UIView transitionFromView:(nonnull UIView *) toView:(nonnull UIView *) duration:(NSTimeInterval) options:(UIViewAnimationOptions) completion:^(BOOL finished) {//动画执行提交后的操作}];
//在该动画过程中,fromView 会从父视图中移除,并将 toView 添加到父视图中,注意转场动画的作用对象是父视图(过渡效果体现在父视图上)。调用该方法相当于执行下面两句代码:
[fromView.superview addSubview:toView];
[fromView removeFromSuperview]//单个视图的过渡效果:
[UIView transitionWithView:(nonnull UIView *)duration:(NSTimeInterval)options:(UIViewAnimationOptions)animations:^{//执行的动画}completion:^(BOOL finished) {//动画执行提交后的操作}];[UIView animateWithDuration:3.0 animations:^{self.redView.center = point;self.redView.transform = CGAffineTransformMakeScale(1.5, 1.5);self.redView.transform = CGAffineTransformMakeRotation(M_PI);} completion:^(BOOL finished) {[UIView animateWithDuration:2.0 animations:^{self.redView.frame = CGRectMake(100, 100, 100, 100);self.redView.transform = CGAffineTransformMakeScale(1 / 1.5,1 / 1.5);self.redView.transform = CGAffineTransformMakeRotation(M_PI);}];}];//animateWithDuration 动画持续时间
//delay 动画延迟执行的时间
//usingSpringWithDamping 震动效果,范围0~1,数值越小震动效果越明显
//initialSpringVelocity 初始速度,数值越大初始速度越快
//options 动画的过渡效果[UIView animateWithDuration:3.0  delay:1.0 usingSpringWithDamping:0.3 initialSpringVelocity:1 options:UIViewAnimationOptionAllowUserInteraction animations:^{self.redView.alpha = 1.0;self.redView.frame = CGRectMake(200, 350, 140, 140);} completion:^(BOOL finished) {[self.redView removeFromSuperview];}];

2.模糊效果的使用

3.使用 maskView 设计动画

4.使用 Facebook 开源动画库 POP 实现真实衰减与弹簧动画

5.用缓动函数模拟物理动画

6.使用带粒子效果的 CAEmitterLayer

7.iOS 中 CAGradientLayer 的使用

8.iOS 中 CALayer 的使用

9.iOS绘图API绘制线条文字几何图形

IOS 复杂动画设计 (一)相关推荐

  1. ios 动画设计_动画和讲故事在设计中的力量

    ios 动画设计 As human beings, we've always been fond of storytelling. Just think of campfire stories, Sa ...

  2. iOS教程:移动终端游戏动画设计的12个原则

    在移动设备用户体验设计领域,微妙精致的动画已成为非常重要的设计元素.为任何对象添加动画并不简单,需要观察研究在真实世界中物体是如何在时空中运动的,需要设计者关注细节,并且具有耐心.适当的动画能够提供清 ...

  3. [iOS]过渡动画之高级模仿 airbnb

    注意:我为过渡动画写了两篇文章: 第一篇:[iOS]过渡动画之简单模仿系统,主要分析系统简单的动画实现原理,以及讲解坐标系.绝对坐标系.相对坐标系,坐标系转换等知识,为第二篇储备理论基础.最后实现 M ...

  4. 【原】移动web动画设计的一点心得——css3实现跑步

    今年3月份,由于公司业务需要,我转岗到微信产品部,离开了TID团队,人都是有感情的动物,更何况在一个团队呆了快 3 年,心中十分舍不得,鬼哥说了"天下没有不散的宴席...",在我的 ...

  5. ae制h5文字动画_大杀器Bodymovin和Lottie:把AE动画转换成HTML5/Android/iOS原生动画

    前段时间听部门老大说,Airbnb出了个移动端的动画库Lottie,可以和一个名叫Bodymovin的AE插件结合起来,把在AE上做好的动画导出为json文件,然后以Android/iOS原生动画的形 ...

  6. iOS 常用动画第三方

    动画 Core Animation笔记,基本的使用方法 - Core Animation笔记,基本的使用方法:1.基本动画,2.多步动画,3.沿路径的动画,4.时间函数,5.动画组. awesome- ...

  7. iOS App体验设计

    转自:http://www.36kr.com/p/29900.html 编者按:本文来自成都彩程设计的CTO肖轶翔「@yxshawn」,关注「iOS,人机交互,UED,音乐人,多媒体,哲学,科幻,电子 ...

  8. iPhone开发教程之iOS APP体验设计 - 醒醒吧 ))))) - majszt - 和讯博客

    iPhone开发教程之iOS APP体验设计 iPhone开发    |   更新时间:2012-10-15   |   点击:131    |   来源:本站 iOS APP体验设计不像互联网的体验 ...

  9. SVGA 礼物动画设计相关

    1.1 什么是SVGA SVGA 是由 YY 团队开发出来的一种跨平台的开源动画格式,同时兼容 iOS / Android / Web.SVGA 除了使用简单,性能卓越,同时让动画开发分工明确,各自专 ...

  10. android 2048 动画,大杀器Bodymovin和Lottie:把AE动画转换成HTML5/Android/iOS原生动画

    前段时间听部门老大说,Airbnb出了个移动端的动画库Lottie,可以和一个名叫Bodymovin的AE插件结合起来,把在AE上做好的动画导出为json文件,然后以Android/iOS原生动画的形 ...

最新文章

  1. iOS中 支付宝钱包详解/第三方支付 韩俊强的博客
  2. golang beego 文件上传
  3. 【Excle数据透视表】如何创建非共享缓存的数据透视表
  4. Remmarguts' Date(POJ2449+最短路+A*算法)
  5. loading 遮罩demo
  6. Centos7 安装python3.7.0
  7. android爬虫_进行Android Web爬虫改造
  8. CSS文件在jsp 文件中应该放的位置
  9. 心电信号频谱图低通Matlab,心电信号处理分析.ppt
  10. java web整合开发完全自学手册pdf_《JavaScript完全自学手册》PDF 下载
  11. python 读写三菱PLC数据,使用以太网读写Q系列,L系列,Fx系列的PLC数据
  12. 处理数据库镜像问题的一个案例——数据库主体与镜像断开连接
  13. Unity Windows PC获得唯一标识符
  14. 关于tomcat启动时的警告 :maxActive is not used inDBCP2
  15. HTML中如何为网页添加背景音乐
  16. VantUi 底部Tabbar跳转页面的方法以及产生的Bug问题
  17. KIngcms 5.1版本增加站内链接功能自动给指定关键词加上链接
  18. 历史上几次股市大崩盘
  19. 绍兴市第十六届计算机复赛试题,绍兴市第十七届少儿信息学竞赛复赛试题
  20. 面试官如何考察你的思维方式?学会这个思维方式面试很简单!

热门文章

  1. 如何利用邮件推广给企业增加更多的流量
  2. 斯坦福大学Pi Network,火遍全球的神级项目
  3. python时间转换字符串的方法
  4. Java list安全删除元素详解
  5. TW-Fe3O4茶渣负载纳米四氧化三铁 /Cu-Fe3O4 四氧化三铁负载铜水煤气
  6. 情侣飞行棋源码分享,轻松打造情侣专属游戏
  7. 智慧城市智慧灯杆IP网络广播紧急求助系统
  8. CSU 1684-Disastrous Downtime
  9. CF 1425 - E. Excitation of Atoms
  10. python + requests + selenium 模拟几个网站的登录