蓝懿 iOS 动画Animation

iOS Animation详解

本篇只要讲解iOS中动画的使用. Animtion主要分为两类:UIView动画和CoreAnimation动画。 UIView动画有UIView属性动画,UIViewBlock动画,UIViewTransition动画。 而CoreAnimation动画主要通过CAAnimation和CALayer,常用的有CABasicAnimation,CAKeyframeAnimation,CATransition,CAAnimationGroup.

UIView动画

UIView属性动画

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

<code class="hljs" objectivec="">CGRect viewRect = CGRectMake(10,10,200,200);

self.myView= [[UIView alloc] initWithFrame:viewRect];

self.myView.backgroundColor = [UIColor whiteColor];

[self.view addSubview:self.myView];

//1 准备动画

//参数1: 动画的作用, 任意字符串,用来区分多个动画, 参数二: 传递参数用 nil:OC中使用

[UIView beginAnimations:@changeSizeAndColor context:nil];

//在准备动画的时候可以设置动画的属性

[UIView setAnimationDuration:0.7];

[UIView setAnimationDelegate:self];

[UIView setAnimationWillStartSelector:@selector(startAnimation)];

[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];//动画的曲线

[UIView setAnimationRepeatCount:2];

[UIView setAnimationRepeatAutoreverses:YES];//动画往返执行, 必须设置动画的重复次数

//2 修改view的属性, 可以同时修改多个属性 注意:不是所有的属性都可以修改的(只有frame, center, bounds, backgroundColor, alpha, transform 可以修改)

self.myView.frame = CGRectMake(110, 100, 100, 100);

self.myView.backgroundColor = [UIColor colorWithRed:arc4random() % 256 / 255.0 green:arc4random() % 256 / 255.0 blue:arc4random() % 256 / 255.0 alpha:0.5];

//3 提交并执行动画

[UIView commitAnimations];</code>

Block动画

Block动画的实质是对UIView动画的封装

第一种

?


1

2

3

<code class="hljs" objectivec="">   [UIView animateWithDuration:2 animations:^{

        self.myView.backgroundColor = [UIColor orangeColor];

    }];</code>

第二种

?


1

2

3

4

5

6

7

8

<code class="hljs" objectivec="">    [UIView animateWithDuration:2 animations:^{

        self.myView.backgroundColor = [UIColor orangeColor];

    } completion:^(BOOL finished) {

        //finished判断动画是否完成

        if (finished) {

            NSLog(@finished);

        }

    }];</code>

第三种

?


1

2

3

4

5

6

7

8

9

<code class="hljs" objectivec=""> [UIView animateWithDuration:2 delay:1 options:UIViewAnimationOptionCurveEaseInOut animations:^{

        //        设置要修改的View属性

        self.myView.backgroundColor = [UIColor orangeColor];

    } completion:^(BOOL finished) {

        //finished判断动画是否完成

        if (finished) {

            NSLog(@finished);

        }

    }];</code>

下面是AnimationOptionCurve参数:

?


1

2

3

4

5

6

7

8

<code class="hljs" haskell=""> UIViewAnimationOptionTransitionNone            = 0 << 20, // default

    UIViewAnimationOptionTransitionFlipFromLeft    = 1 << 20,

    UIViewAnimationOptionTransitionFlipFromRight   = 2 << 20,

    UIViewAnimationOptionTransitionCurlUp          = 3 << 20,

    UIViewAnimationOptionTransitionCurlDown        = 4 << 20,

    UIViewAnimationOptionTransitionCrossDissolve   = 5 << 20,

    UIViewAnimationOptionTransitionFlipFromTop     = 6 << 20,

    UIViewAnimationOptionTransitionFlipFromBottom  = 7 << 20,</code>

CoreAnimation动画

Core Animation是一组非常强大的动画处理API,使用它能做出非常绚丽的动画效果,而且往往是事半功倍,使用它需要添加QuartzCore .framework和引入对应的框架

CABasicAnimation基本动画

CABasicAnimation基本动画没有真正的修改属性值

初始化UIView的layer

?


1

2

3

4

5

6

7

8

9

10

11

12

13

<code avrasm="" class="hljs"> CGRect viewRect = CGRectMake(50,100,200,200);

    self.myView= [[UIView alloc] initWithFrame:viewRect];

    self.myView.backgroundColor = [UIColor whiteColor];

    self.myView.layer.cornerRadius = 100;//设置圆角, 参数是内切圆的半径, 若想画一个圆, 前提是view必须是正方形, 参数应该是view边长的一半

    self.myView.layer.borderWidth = 5;//设置描边的宽度

    self.myView.layer.borderColor = [UIColor orangeColor].CGColor;//设置描边的颜色(UIView上的颜色使用的是UIColor, CALayer上使用的颜色是CGColor)

    self.myView.layer.shadowOffset = CGSizeMake(50, 100);//设置阴影的偏移量 width影响水平偏移(正右负左), height影响垂直偏移(正下负上)

    self.myView.layer.shadowColor = [UIColor redColor].CGColor;//阴影的偏移的颜色

    self.myView.layer.shadowOpacity = 0.5;//阴影的不透明度, 取值范围(0 ~ 1), 默认是0, 就是透明的

    [self.view addSubview:self.myView];</code>

动画方法:

?


1

2

3

4

5

6

7

8

9

10

11

<code avrasm="" class="hljs"> //1 创建并指定要修改的属性

    //    KeyPath:CAlayer的属性名, 不是所有的属性都可以, 只有在头文件中出现animatable的属性才可以, 可以修改属性的属性, 例如:bounds.size

    CABasicAnimation *basic = [CABasicAnimation animationWithKeyPath:@bounds];

    [basic setDuration:0.7];

    //2 修改属性值

    basic.fromValue = [NSValue valueWithCGRect:CGRectMake(0, 0, self.myView.bounds.size.width, self.myView.bounds.size.height)];

    basic.toValue = [NSValue valueWithCGRect:CGRectMake(0, 0, 300, 300)];

    //3 添加动画

    //key做区分动画用

    [self.myView.layer addAnimation:basic forKey:@changColor];

</code>

CAKeyframeAnimation关键帧动画

示例1,和上面的动画一样

?


1

2

3

4

5

6

7

8

9

<code avrasm="" class="hljs"//1 创建动画

     CAKeyframeAnimation *keyFrame = [CAKeyframeAnimation animationWithKeyPath:@bounds];

     [keyFrame setDuration:2];

     //2 修改属性

     keyFrame.values = @[[NSValue valueWithCGRect:CGRectMake(0, 0, self.myView.bounds.size.width, self.myView.bounds.size.height)], [NSValue valueWithCGRect:CGRectMake(0, 0, 250, 250)], [NSValue valueWithCGRect:CGRectMake(0, 0, 300, 300)]];

    //keyTimes:值代表了出现动画的时刻, 值得范围是0~1, 值必须是递增的, keyTimes和values是一一对应的

     keyFrame.keyTimes = @[@(0.4), @(0.6), @(1)];

     //3 添加动画

     [self.myView.layer addAnimation:keyFrame forKey:@keyFrame];  </code>

示例2,改变颜色

?


1

2

3

4

5

<code class="hljs" objectivec="">  CAKeyframeAnimation *keyFrame = [CAKeyframeAnimation animationWithKeyPath:@backgroundColor];

    [keyFrame setDuration:3];

    keyFrame.values = @[(id)[UIColor redColor].CGColor, (id)[UIColor orangeColor].CGColor, (id)[UIColor yellowColor].CGColor, (id)[UIColor greenColor].CGColor, (id)[UIColor blueColor].CGColor];

    keyFrame.keyTimes = @[@(0.3), @(0.5), @(0.6), @(0.7), @(0.9)];

    [self.myView.layer addAnimation:keyFrame forKey:nil];</code>

CATransaction 过度动画

?


1

2

3

4

5

6

7

8

<code class="hljs" oxygene=""//1 创建

    CATransition *transition = [CATransition animation];

    [transition setDuration:2];

    //2 设置过度样式

    transition.type = kCATransitionReveal;//控制样式

    transition.subtype = kCATransitionFromTop;//控制方向

    //添加动画

    [self.myView.layer addAnimation:transition forKey:nil];</code>

CAAnimationGroup 组动画

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

<code class="hljs" objectivec=""> //1 创建并指定要修改的属性

    //    KeyPath:CAlayer的属性名, 不是所有的属性都可以, 只有在头文件中出现animatable的属性才可以, 可以修改属性的属性, 例如:bounds.size

    //    CALayer

    CABasicAnimation *basic = [CABasicAnimation animationWithKeyPath:@bounds];

    [basic setDuration:2];

    //2 修改属性值

    basic.fromValue = [NSValue valueWithCGRect:CGRectMake(0, 0, self.myView.bounds.size.width, self.myView.bounds.size.height)];

    basic.toValue = [NSValue valueWithCGRect:CGRectMake(0, 0, 300, 300)];

    CAKeyframeAnimation *keyFrame = [CAKeyframeAnimation animationWithKeyPath:@backgroundColor];

    [keyFrame setDuration:2];

    keyFrame.values = @[(id)[UIColor redColor].CGColor, (id)[UIColor orangeColor].CGColor, (id)[UIColor yellowColor].CGColor, (id)[UIColor greenColor].CGColor, (id)[UIColor blueColor].CGColor];

    //keyTimes中的第一个值是0, 不能修改

    keyFrame.keyTimes = @[@(0.3), @(0.5), @(0.6), @(0.7), @(0.9)];

    // 创建

    //当group动画的时长 > 组中所有动画的最长时长, 动画的时长以组中最长的时长为准

    //当group动画的时长 < 组中所有动画的最长时长, 动画的时长以group的时长为准

    //最合适: group的时长 = 组中所有动画的最长时长

    CAAnimationGroup *group = [CAAnimationGroup animation];

    [group setDuration:10];

    //设置组动画

    group.animations = @[basic, keyFrame];

    //添加动画

    [self.myView.layer addAnimation:group forKey:nil];</code>

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

<code class="hljs" objectivec="">//**平移动画**

CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@position];

// 动画持续1秒

anim.duration =1;

//因为CGPoint是结构体,所以用NSValue包装成一个OC对象

anim.fromValue = [NSValue valueWithCGPoint:CGPointMake(50, 50)];

anim.toValue = [NSValue valueWithCGPoint:CGPointMake(100, 100)];

//通过MyAnim可以取回相应的动画对象,比如用来中途取消动画

[layer addAnimation:anim forKey:@MyAnim];

//**缩放动画**

CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@transform];

//没有设置fromValue说明当前状态作为初始值

//宽度(width)变为原来的2倍,高度(height)变为原来的1.5倍

anim.toValue = [NSValuevalueWithCATransform3D:CATransform3DMakeScale(2, 1.5, 1)];

anim.duration = 1;

[layer addAnimation:anim forKey:nil];

/**/旋转动画**

CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@transform];

//这里是以向量(1, 1, 0)为轴,旋转π/2弧度(90°)

//如果只是在手机平面上旋转,就设置向量为(0, 0, 1),即Z轴

anim.toValue = [NSValuevalueWithCATransform3D:CATransform3DMakeRotation(M_PI_2, 1, 1, 0)];

anim.duration = 1;

[layer addAnimation:anim forKey:nil];</code>

UIImageView的帧动画

?


1

2

<code> UIImageView可以让一系列的图片在特定的时间内按顺序显示 .

</code>

相关属性解析:

?


1

2

3

4

5

6

<code>animationImages:要显示的图片(一个装着UIImage的NSArray) .

animationDuration:完整地显示一次animationImages中的所有图片所需的时间 .

animationRepeatCount:动画的执行次数(默认为0,代表无限循环)

</code>

相关方法解析:

?


1

2

3

4

5

6

<code>- (void)startAnimating; 开始动画 .

- (void)stopAnimating;  停止动画 .

- (BOOL)isAnimating;  是否正在运行动画.

</code>

 

时间: 2024-10-13 23:24:55

蓝懿 iOS 动画Animation的相关文章

#在蓝懿iOS学习的日子#

#在蓝懿iOS学习的日子#昨天我们学习了让uiimaag,学习了如何的插入图片,学习如何让它上下左右移动,其实就是加入按钮buttonon来控制图片的方向,还学习让图片在一定的范围内来回的移动,最后还制作了一个简易的游戏,我们都称之为简易的反射器,在下方设立一个按钮,发射一个图片,打击上方左右移动的image,为胜利,并以打中一次,来进行计分,难点就是两个图片的碰撞,设立的放h是这样的: //设置luobo与tu1障碍物的碰撞 //frame是指图片的矩形,进行碰撞 if (CGRectInte

蓝懿 iOS一周学习总结

在蓝懿学习已经一周多了. 时间如流水,在期间的日子慢慢冲刷掉了我的消极和懒惰.这些天来过得非常充实而充满张力.处于老师的富有创新的讲课方式和充满虚席热情的同学包围中,时间过得飞快. 在此回顾一下这些天的学习内容和学习感受. 课程从Objective-C开始.在老师介绍完计算机编程语言和基本的iOS基本常识后,正式进入OC的课程. 第一天,不仅认识了很多积极进取的同学.我们还接触到了如何控制label 让它显示指定的内容和Button 获取用户点击的事件的,虽然是简单的尝试,但是让我们对使用XCo

蓝懿IOS绘图Quartz2D练习

今天刘国斌老师给我们讲了Quartz2D,它是一个绘图工具在oc语言里设计者想在页面上画东西,必须先准备画板,再准备画布,之后在画布上绘图,最后渲染到屏幕. 开课快两个月了,老师讲课方式很独特,能够尽量让每个人都能弄明白,有的比较难懂的地方,如果有的地方还是不懂得话,老师会换个其它方法再讲解,这对于我们这些学习iOS的同学是非常好的,多种方式的讲解会理解得更全面,这个必须得给个赞,嘻嘻,还有就是这里的学习环境很好,很安静,可以很安心的学习,安静的环境是学习的基础,小班讲课,每个班20几个学生,学

蓝懿 ios的一周学习总结 刘国斌老师

再一次来到北京,我激励自已这一次一定要有所收获,有所成功.不能再像大学那样子混日子,浪费自已的青春,看着身边的朋友一个个的付出努力地汗水并成长着,而独自神伤的继续颓废.因为害怕失败所以我对未来的学习方向与机构进行了详细的考察.不光在网上多次咨询 还一次次到了每一个培训机构参观考察. 去过蓝欧 达内 千峰 尙观等,他们又大又小每一个我都试听了半天.每一个都亲身感受了一次,最后我来决定了来到蓝欧不仅仅是因为他的价格最低更是因为所有的培训机构所学的内容都是一样的,但老师要照顾六七十学生,和老师教20个

蓝懿IOS学习图片编辑器

ios的学习在蓝懿另个月了,感觉学到了很多,这里的环境不错学习氛围也很好,刘国斌老师教了图片编辑,模拟美图秀秀,功能实现了边框,效果.滤镜,还有涂鸦. #pragma mark - Image picker controller 协议方法 - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info

#蓝懿ios学习的日子#2015年10月12鈤

已经是进入蓝懿基础训练营的第四天,今天是练习日,刘国斌老师让自己练习敲代码,大家都很积极,早早就来到教室开始时敲代码,我呢,就把这几天学习的都每个都创建了一个的项目,开始练习第一天,如何学习ioS是什么,比较与市场的其他编程,和其他系统的区别,了解职业发展的进程,最后,刘国斌老师不但给我们介绍了xcode,还教我们用Xcode做了个iOS的UI界面的一个UI类label的生成,还有生成界面是怎么样的(在后面的 图片会展示我的成果),我们大家没一人还练习了一遍,只要认真的看老师做一遍,会打字,就会

蓝懿iOS,刘国斌iOS

来到蓝懿已经是第四天了,刘国斌老师亲自授课.刘老师讲课非常好,很生动形象,便于我们零基础的理解.以前就有朋友和同学之类的做it行业,她们有些也是女生,也做得不错.这次通过朋友的介绍来到北京,刘国斌老师的培训机构,坐了22个小时的火车,简直累到内向,趋于崩溃.不过来到北京之后,刘国斌老师的助理很友好以及热情,帮我们联系住宿的地方,而且还帮忙提行李,心里面很感激. 8月底的时候去了一次千峰,第一感觉那里的学费比较贵,而刘国斌老师这里的ios培训第二期的女生只需要半价哦,6000元整,而且都是刘老师亲

蓝懿IOS学习SQL数据库

当前类中导入头文件 // 1.打开数据库 // 创建数据库文件所在路径字符串 NSString *path = @"/Users/Boris/Public/蓝懿第三期/Day31 - SQLite/test.db"; // 创建数据库指针, 先赋值为空, 稍后他会被赋值. // 以防万一出现野指针, C语言的空是 NULL, ObjC的空是 nil sqlite3 *db = NULL; // 打开数据库, 并且把已经打开的数据库赋值给 db 这个指针. // 第一个参数是数据库文件位

iOS 动画Animation - 5:UIBezier

首先说明:这是一系列文章,參考本专题下其它的文章有助于你对本文的理解. 在之前的bolg中大家会发现总是会出现UIBezier,可是我也没有做过多介绍,今天就集中介绍一下UIBezier.首先.UIBezier的内容比較多,我今天介绍的也不是UIBezier的所有,可是大部分经常使用到的我都会介绍一下.至于其它的,请大家參考官方文档. 由于今天的内容比較多.也可能有些地方不是非常easy理解,我会尽量的把他介绍的看起来简单一些,方便学习. 首先上一张图,你就会看到今天要讲到的内容 这就是今天要讲