iOS动画-从UIView到Core Animation

首先,介绍一下UIView相关的动画。

  1. UIView普通动画:
[UIView beginAnimations: context:];[UIView commitAnimations];

动画属性设置:

 1     //动画持续时间
 2     [UIView setAnimationDuration:(NSTimeInterval)];
 3     //动画的代理对象
 4     [UIView setAnimationDelegate:(nullable id)];
 5     //设置动画将开始时代理对象执行的SEL
 6     [UIView setAnimationWillStartSelector:(nullable SEL)];
 7     //设置动画延迟执行的时间
 8     [UIView setAnimationDelay:(NSTimeInterval)];
 9     //设置动画的重复次数
10     [UIView setAnimationRepeatCount:(float)];
11     //设置动画的曲线
12     /*
13      UIViewAnimationCurve的枚举值:
14      UIViewAnimationCurveEaseInOut,         // 慢进慢出(默认值)
15      UIViewAnimationCurveEaseIn,            // 慢进
16      UIViewAnimationCurveEaseOut,           // 慢出
17      UIViewAnimationCurveLinear             // 匀速
18      */
19     [UIView setAnimationCurve:(UIViewAnimationCurve)];
20     //设置是否从当前状态开始播放动画
21     /*假设上一个动画正在播放,且尚未播放完毕,我们将要进行一个新的动画:
22      当为YES时:动画将从上一个动画所在的状态开始播放
23      当为NO时:动画将从上一个动画所指定的最终状态开始播放(此时上一个动画马上结束)*/
24     [UIView setAnimationBeginsFromCurrentState:YES];
25     //设置动画是否继续执行相反的动画
26     [UIView setAnimationRepeatAutoreverses:(BOOL)];
27     //是否禁用动画效果(对象属性依然会被改变,只是没有动画效果)
28     [UIView setAnimationsEnabled:(BOOL)];
29     //设置视图的过渡效果
30     /* 第一个参数:UIViewAnimationTransition的枚举值如下
31      UIViewAnimationTransitionNone,              //不使用动画
32      UIViewAnimationTransitionFlipFromLeft,      //从左向右旋转翻页
33      UIViewAnimationTransitionFlipFromRight,     //从右向左旋转翻页
34      UIViewAnimationTransitionCurlUp,            //从下往上卷曲翻页
35      UIViewAnimationTransitionCurlDown,          //从上往下卷曲翻页
36      第二个参数:需要过渡效果的View
37      第三个参数:是否使用视图缓存,YES:视图在开始和结束时渲染一次;NO:视图在每一帧都渲染*/
38     [UIView setAnimationTransition:(UIViewAnimationTransition) forView:(nonnull UIView *) cache:(BOOL)];

举2个例子:

 1     [UIView beginAnimations:@"xxx" context:nil];
 2     [UIView setAnimationDuration:5];
 3     [UIView setAnimationRepeatCount:MAXFLOAT];
 4     [UIView setAnimationDelegate:self];
 5     [UIView setAnimationDelay:3];
 6     [UIView setAnimationWillStartSelector:@selector(animationWillStart)];
 7     [UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
 8     [UIView setAnimationRepeatAutoreverses:YES];
 9     
10     self.iView.frame = CGRectMake(200, 400, 100, 100);
11     
12     [UIView commitAnimations];
 1     [UIView beginAnimations:@"xxx" context:nil];
 2     [UIView setAnimationDuration:2];
 3     [UIView setAnimationRepeatCount:MAXFLOAT];
 4     [UIView setAnimationDelegate:self];
 5     //[UIView setAnimationDelay:3];
 6     [UIView setAnimationWillStartSelector:@selector(animationWillStart)];
 7     [UIView setAnimationCurve:UIViewAnimationCurveLinear];
 8     //[UIView setAnimationRepeatAutoreverses:YES];
 9     
10     [UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:self.iView cache:YES];
11     
12     [UIView commitAnimations];

 

      2.   UIView Block动画

1 [UIView animateWithDuration:(NSTimeInterval)//动画时间
2     animations:^{
3         //执行的动画
4     }];
1 [UIView animateWithDuration:(NSTimeInterval)//动画时间
2                      animations:^{
3         //执行的动画
4     } completion:^(BOOL finished) {
5         //动画结束的回调
6     }];
1 [UIView animateWithDuration:(NSTimeInterval)//动画时间
2                           delay:(NSTimeInterval)//动画延迟时间
3                         options:(UIViewAnimationOptions)//动画过渡效果
4                      animations:^{
5         //执行动画
6     } completion:^(BOOL finished) {
7         //动画结束回调
8     }]
UIViewAnimationOptions的枚举值:
    UIViewAnimationOptionLayoutSubviews            //进行动画时布局子控件UIViewAnimationOptionAllowUserInteraction      //进行动画时允许用户交互UIViewAnimationOptionBeginFromCurrentState     //从当前状态开始动画UIViewAnimationOptionRepeat                    //无限重复执行动画UIViewAnimationOptionAutoreverse               //执行动画回路UIViewAnimationOptionOverrideInheritedDuration //忽略嵌套动画的执行时间设置UIViewAnimationOptionOverrideInheritedCurve    //忽略嵌套动画的曲线设置UIViewAnimationOptionAllowAnimatedContent      //转场:进行动画时重绘视图UIViewAnimationOptionShowHideTransitionViews   //转场:移除(添加和移除图层的)动画效果UIViewAnimationOptionOverrideInheritedOptions  //不继承父动画设置
    UIViewAnimationOptionCurveEaseInOut            //时间曲线,慢进慢出(默认值)UIViewAnimationOptionCurveEaseIn               //时间曲线,慢进UIViewAnimationOptionCurveEaseOut              //时间曲线,慢出UIViewAnimationOptionCurveLinear               //时间曲线,匀速
    UIViewAnimationOptionTransitionNone            //转场,不使用动画UIViewAnimationOptionTransitionFlipFromLeft    //转场,从左向右旋转翻页UIViewAnimationOptionTransitionFlipFromRight   //转场,从右向左旋转翻页UIViewAnimationOptionTransitionCurlUp          //转场,下往上卷曲翻页UIViewAnimationOptionTransitionCurlDown        //转场,从上往下卷曲翻页UIViewAnimationOptionTransitionCrossDissolve   //转场,交叉消失和出现UIViewAnimationOptionTransitionFlipFromTop     //转场,从上向下旋转翻页UIViewAnimationOptionTransitionFlipFromBottom  //转场,从下向上旋转翻页

这3个动画比较简单,不再多做叙述。

 

 

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

[UIView animateWithDuration:(NSTimeInterval)//动画持续时间delay:(NSTimeInterval)//动画延迟执行的时间usingSpringWithDamping:(CGFloat)//震动效果,范围0~1,数值越小震动效果越明显initialSpringVelocity:(CGFloat)//初始速度,数值越大初始速度越快options:(UIViewAnimationOptions)//动画的过渡效果animations:^{//执行的动画
 }completion:^(BOOL finished) {//动画执行提交后的操作}];
[UIView animateWithDuration:3 delay:0 usingSpringWithDamping:0.2 initialSpringVelocity:5 options:UIViewAnimationOptionRepeat animations:^{self.iView.frame = CGRectMake(200, 400, 100, 100);self.iView.transform = CGAffineTransformRotate(self.iView.transform, M_PI);} completion:^(BOOL finished) {}];

 

Keyframes动画:

IOS7.0后新增了关键帧动画,支持属性关键帧,不支持路径关键帧[UIView animateKeyframesWithDuration:(NSTimeInterval)//动画持续时间delay:(NSTimeInterval)//动画延迟执行的时间options:(UIViewKeyframeAnimationOptions)//动画的过渡效果animations:^{//执行的关键帧动画
 }completion:^(BOOL finished) {//动画执行提交后的操作}];

 

Core Animation

CABasicAnimation:

//  常用属性:
    duration:动画的持续时间repeatCount:重复次数,无限循环可以设置HUGE_VALF或者MAXFLOATrepeatDuration:重复时间speed:动画速率,决定动画时间的倍率。当speed为2时,动画时间为设置的duration的1/2。timeOffset:动画时间偏移量。比如设置动画时长为3秒,当设置timeOffset为1.5时,当前动画会从中间位置开始,并在到达指定位置时,走完之前跳过的前半段动画。removedOnCompletion:默认为YES,代表动画执行完毕后就从图层上移除,图形会恢复到动画执行前的状态。如果想让图层保持显示动画执行后的状态,那就设置为NO,不过还要设置fillMode为kCAFillModeForwardsfillMode:决定当前对象在非active时间段的行为。比如动画开始之前或者动画结束之后kCAFillModeRemoved:这个是默认值,也就是说当动画开始前和动画结束后,动画对layer都没有影响,动画结束后,layer会恢复到之前的状态kCAFillModeForwards:当动画结束后,layer会一直保持着动画最后的状态kCAFillModeBackwards:在动画开始前,只需要将动画加入了一个layer,layer便立即进入动画的初始状态并等待动画开始。kCAFillModeBoth:这个其实就是上面两个的合成.动画加入后开始之前,layer便处于动画初始状态,动画结束后layer保持动画最后的状态beginTime:可以用来设置动画延迟执行时间,若想延迟2s,就设置为CACurrentMediaTime()+2,CACurrentMediaTime()为图层的当前时间timingFunction:速度控制函数,控制动画运行的节奏kCAMediaTimingFunctionLinear(线性):匀速,给你一个相对静态的感觉kCAMediaTimingFunctionEaseIn(渐进):动画缓慢进入,然后加速离开kCAMediaTimingFunctionEaseOut(渐出):动画全速进入,然后减速的到达目的地kCAMediaTimingFunctionEaseInEaseOut(渐进渐出):动画缓慢的进入,中间加速,然后减速的到达目的地。这个是默认的动画行为。delegate:动画代理autoreverses:动画完成后是否以动画形式回到初始值fromValue:keyPath相应属性的初始值toValue:keyPath相应属性的结束值byValue:keyPath相应属性的改变值`fromValue`,`toValue`和`byValue`属性可以用很多种方式来组合,但为了防止冲突,不能一次性同时指定这三个值。例如,如果指定了`fromValue`等于2,`toValue`等于4,`byValue`等于3,那么Core Animation就不知道结果到底是4(`toValue`)还是5(`fromValue + byValue`)了。他们的用法在`CABasicAnimation`头文件中已经描述的很清楚了,所以在这里就不重复了。总的说来,就是只需要指定`toValue`或者`byValue`,剩下的值都可以通过上下文自动计算出来。

实例化方法:

CABasicAnimation *basicAnimation = [CABasicAnimation animationWithKeyPath:@"position"];

其中keyPath表示动画类型,常用的keyPath:

 

举一个例子:

CABasicAnimation *basicAnimation = [CABasicAnimation animationWithKeyPath:@"position"];
basicAnimation.duration = 5;
basicAnimation.removedOnCompletion = NO;
basicAnimation.fillMode = kCAFillModeForwards;// basicAnimation.fromValue = [NSValue valueWithCGPoint:CGPointMake(100, 100)];
basicAnimation.toValue = [NSValue valueWithCGPoint:CGPointMake(200, 400)];[self.iView.layer addAnimation:basicAnimation forKey:@"rotation"];

“position”也可以替换成上图其他的值,"fromvalue"/"toValue"/"byValue"要与动画类型'keypath'对应。

 

CAKeyframeAnimation:关键帧动画

关键帧动画和CABasicAnimation一样是CApropertyAnimation的子类,但是CABasicAnimation只能从一个数值(fromValue)变到另一个数值(toValue)或者添加一个增量数值(byValue),而CAKeyframeAnimation使用values数组可以设置多个关键帧,同时可以利用path可以进行位置或者锚点的动画操作。

常用属性:

values:关键帧数组对象,里面每一个元素即为一个关键帧,动画会在对应的时间段内,依次执行数组中每一个关键帧的动画。
path:动画路径对象,可以指定一个路径,在执行动画时路径会沿着路径移动,Path在动画中只会影响视图的Position。
keyTimes:设置关键帧对应的时间点,范围:0-1。如果没有设置该属性,则每一帧的时间平分。
timingFunctions:每一帧对应的动画节奏。
rotationMode:动画沿路径旋转方式。例如让一个视图按照一条三次贝塞尔曲线移动,如果rotationMode=kCAAnimationRotateAuto,那么这个视图会沿着曲线的切线移动,而不是直来直去的。如下图所示:

 

 

举例:

if (tag == 6) {//使用“values”keyFrameAni = [CAKeyframeAnimation animationWithKeyPath:@"transform.rotation"];keyFrameAni.duration = 0.3;keyFrameAni.values = @[@(-(4) / 180.0*M_PI),@((4) / 180.0*M_PI),@(-(4) / 180.0*M_PI)];keyFrameAni.repeatCount=MAXFLOAT;}else if (tag == 7){//使用“path”路径keyFrameAni = [CAKeyframeAnimation animationWithKeyPath:@"position"];UIBezierPath *path = [UIBezierPath bezierPath];[path moveToPoint:_aniLayer.position];[path addCurveToPoint:CGPointMake(300, 500) controlPoint1:CGPointMake(100, 400) controlPoint2:CGPointMake(300, 450)];keyFrameAni.path = path.CGPath;keyFrameAni.duration = 1;
1}[_aniLayer addAnimation:keyFrameAni forKey:@"keyFrameAnimation"];

 

CASpringAnimation

CASpringAnimation是iOS9才引入的动画类,效果类似于UIView的spring动画,不过比其增加了质量,劲度系数等属性的扩展,继承于CABaseAnimation,用法也很简单:

CASpringAnimation *springAnimation = [CASpringAnimation animationWithKeyPath:@"position"];//质量,影响图层运动时的弹簧惯性,质量越大,弹簧拉伸和压缩的幅度越大springAnimation.mass = 1;//刚度系数(劲度系数/弹性系数),刚度系数越大,形变产生的力就越大,运动越快springAnimation.stiffness = 10;//阻尼系数,阻止弹簧伸缩的系数,阻尼系数越大,停止越快springAnimation.damping = 3;//初始速率,动画视图的初始速度大小 Defaults to zero//速率为正数时,速度方向与运动方向一致,速率为负数时,速度方向与运动方向相反springAnimation.initialVelocity = 10;//settlingDuration:估算时间 返回弹簧动画到停止时的估算时间,根据当前的动画参数估算springAnimation.duration = springAnimation.settlingDuration;springAnimation.toValue = [NSValue valueWithCGRect:CGRectMake(100, 400, 100, 100)];[self.iView.layer addAnimation:springAnimation forKey:@"spring"];

 

CATransition:转场动画

CATransition是CAAnimation的子类,用于做转场动画,能够为层提供移出屏幕和移入屏幕的动画效果。iOS比Mac OS X的转场动画效果少一点
UINavigationController就是通过CATransition实现了将控制器的视图推入屏幕的动画效果
动画属性:(有的属性是具备方向的,详情看下图)
type:动画过渡类型
subtype:动画过渡方向
startProgress:动画起点(在整体动画的百分比)
endProgress:动画终点(在整体动画的百分比)
-(void)transitionAnimation{self.index++;if (self.index>7) {self.index=1;}self.iImageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"%@.jpg",[NSNumber numberWithInteger:self.index]]];CATransition *transition = [CATransition animation];transition.type = @"cube";//transition.subtype = @"fromRight";transition.duration = 2;[self.iImageView.layer addAnimation:transition forKey:nil];
}

这里是以"cube"和"pageCurl"的效果图,就是上面的代码,没有做成gif图,可以想象一下哈!

 

CAAnimationGroup:动画组

动画组,是CAAnimation的子类,可以保存一组动画对象,将CAAnimationGroup对象加入层后,组中所有动画对象可以同时并发运行

属性说明:
animations:用来保存一组动画对象的NSArray
默认情况下,一组动画对象是同时运行的,也可以通过设置动画对象的beginTime属性来更改动画的开始时间

示例:

CAAnimationGroup *group = [CAAnimationGroup animation];//    创建旋转动画对象CABasicAnimation *retate = [CABasicAnimation animation];//    layer的旋转属性retate.keyPath = @"transform.rotation";//    角度retate.toValue = @(M_PI);//    创建缩放动画对象CABasicAnimation *scale = [CABasicAnimation animation];//    缩放属性scale.keyPath = @"transform.scale";//    缩放比例scale.toValue = @(0.0);//    添加到动画组当中group.animations = @[retate,scale];//           执行动画时间group.duration = 2.0;//    执行完以后不要删除动画group.removedOnCompletion = NO;//          保持最新的状态group.fillMode = kCAFillModeForwards;[self.view.layer addAnimation:group forKey:nil];

 

 

文章转载:https://www.jianshu.com/p/9fa025c42261

转载于:https://www.cnblogs.com/lfyDragon/p/8796518.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/369085.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

视觉表现理论知识

本文地址:http://www.cnblogs.com/veinyin/p/7606714.html 终于可以知道视觉表现的实现方式,而不是一个一个的具体实现了,突然感到自己能够把握页面的整体布局了呢,似乎学到了表现背后的东西? 以下是一个突然发现自己…

java jnlp_java – 调试JNLP启动应用程序

解决方案#1 – 启用Java控制台,并查找异常.您可以通过Java控制面板完成.切换到“高级”选项卡,然后在Java控制台中确保选中“显示控制台”.然后,运行您的应用程序并监视控制台以查找异常.修复异常.解决方案#2 – 调试正在运行的应用程序(正确).像这样启动Web Start应用程序(适用…

201621123055《JAVA程序设计》第三周学习总结

1. 本周学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词。 答:类、对象、关键字等。1.2 用思维导图或者Onenote或其他工具将这些关键词组织起来。(注:首次使用,不太会用软件) 2. 书面作业 1.以面向对象方式改造数据结构…

通过运行示例从WSO2 ESB开始

我最近加入了一个新任务,在该任务中,我们必须基于WSO2工具栈实施ESB解决方案。 尽管我熟悉ESB的大多数概念以及其他一些实现(例如Mule ESB ),但这是我第一次必须使用WSO2 ESB 。 幸运的是,可以找到很多文档…

爬虫(十二):scrapy中spiders的用法

Spider类定义了如何爬去某个网站,包括爬取的动作以及如何从网页内容中提取结构化的数据,总的来说spider就是定义爬取的动作以及分析某个网页 工作流程分析 以初始的URL初始化Request,并设置回调函数,当该request下载完毕并返回时&…

position:fixed 兼容浏览器低版本

项目中遇到的坑,写篇博客做个笔记纪念下,position: fixed一般来说都兼容各个浏览器,但是要兼容浏览低版本问题,就得用-webkit-transform: translateZ(0);这段代码了。 项目中用到position: fixed;z-index: xxx;的时候,…

一些关于博主的xibusana

博主就是OI强省GD内偏远小渔村的咸鱼一条,雄性 高一开始入OI坑,从此走上了爆零和%大佬的不归路。 由于我的ID略多,所以你在网上可能找不到我哦v 2018/9/17 博主现在是一条走高考路的高三狗啊qvq 博客比较少上了,现在的目标还是考上…

监控java_Java应用程序监控JavaMelody

JavaMelody是运行在Java Web容器中,用来监控Java内存和J服务器CPU使用情况,用户Session数量,JDBC连接数,和http请求、sql请求等的执行数量,平均执行时间,错误百分比等。图表可以按天,周&#xf…

Heroku和Java –从新手到初学者,第1部分

最近,我听说Heroku允许在Cedar堆栈中部署Java应用程序。 由于没有真正的软件构想,我决定尝试一下,仅将SOMETHING配置为可在Heroku上运行。 我对ReST有一些迷恋(我仍然想学习并练习),所以我决定我的第一个应…

【谈谈IO】BIO、NIO和AIO

BIO: BIO是阻塞IO,体现在一个线程调用IO的时候,会挂起等待,然后Thread会进入blocked状态;这样线程资源就会被闲置,造成资源浪费,通常一个系统线程数是有限的,而且,Thread进入内核态也…

css动画-模拟正余弦曲线

今天就写一个css3抛物线的动画吧 从左到右的抛物线动画,我们就暂且把动作分为匀速向右运动和变速的上下运动。 水平匀速运动我们可以利用 translateX(x):定义 2D 转换,沿着 X 轴移动元素;以及linear:动画从头到尾的速…

UVA-11549 Calculator Conundrum

InputThe first line of the input contains an integer t (1 ≤ t ≤ 200), the number of test cases. Each test casecontains two integers n (1 ≤ n ≤ 9) and k (0 ≤ k < 10 n ) where n is the number of digits this calculatorcan display k is the starting num…

java 当前类_Java获取当前类名的两种方法

适用于非静态方法&#xff1a;this.getClass().getName()适用于静态方法&#xff1a;Thread.currentThread().getStackTrace()[1].getClassName()获取类名&#xff1a;1、在类的实例中可使用this.getClass().getName();但在static method中不能使用该方法&#xff1b;2、在stat…

具有内部类构造函数参数的Java Reflection奇数

关于Java内部类 Java允许成员类&#xff08;在其他类内定义的类&#xff09;&#xff0c;局部类&#xff08;在语句块内定义的类&#xff09;和匿名类&#xff08;无名称的类&#xff09;&#xff1a; class Outer {Object anonymous new Object(){}; // this is an anonymou…

HDOJ 1012-1020

最近感冒了&#xff0c;有点小咳嗽&#xff0c;做题速度比较慢&#xff0c;本以为这周会做的比较少&#xff0c;没想到全是水题。。。我做的也蛮开心的....对自己无语HDOJ 1012这个题目蛮简单&#xff0c;就是输出格式比较烦&#xff0c;处理好格式基本就没问题了HDOJ 1013这个…

静态页面如何实现 include 引入公用代码

一直以来&#xff0c;我司的前端都是用 php 的 include 函数来实现引入 header 、footer 这些公用代码的&#xff0c;就像下面这样&#xff1a; <!-- index.php --><!DOCTYPE html><html lang"en"><head><meta charset"UTF-8"&…

java list 循环赋值_Java List集合的坑(add方法报空指针,循环赋值时list已保存的值会改变)...

先看空指针异常&#xff1a;ListmovieInfos null;这样创建时&#xff0c;list指向为空&#xff0c;修改方法&#xff1a;ListmovieInfos new ArrayList();再看list循环赋值的问题&#xff1a;问题描述&#xff1a;for (i0;i<10;i){movieInfoSum.movieId (int)recommendatio…

ros使用时的注意事项技巧

1.rosrun package-name executable-name 比如 rosrun turtlesim turtlesim_node 2.一旦启动roscore后,便可以运行ROS程序了。ROS程序的运行实例被称为节点(node)&#xff0c;roscore叫做节点管理器 3.查看节点列表rosnode list 4.需要注意节点名并不一定与对应可执行文件名称相…

分享几道经典的javascript面试题

这几道题目还是有一点意思的&#xff0c;大家可以研究一番&#xff0c;对自己的技能提升绝对有帮助。 1、调用过程中输出的内容是什么 function fun(n, o) {console.log(o);return {fun : function(m) {return fun(m, n);}} }var a fun(0);a.fun(1);a.fun(2);a.fun(3);var…

Rete之外的生活– RIP Rete 2013 :)

我只是对我的新算法进行最后的修改。 它合并了Leaps &#xff0c; 面向集合的Match和Left / Right取消链接的概念 &#xff0c;以及我自己的一些想法。 该代码已提交&#xff0c;但我正在积累工作并编写更多测试。 我将在一周左右的时间内写一个完整的博客&#xff0c;详细介绍…