iOS  中的 UIView 动画编程其实还是很简单的,像 CSS3 一样,在给定的时间内完成状态连续性的变化呈现。比如背景色,Frame 大小,位移、翻转,特明度等。

以前我使用的编程方式都是用下面那样的三段式处理:

1
2
3
4
5
6
7
8
    [UIView beginAnimations:nil context: nil];
    [UIView setAnimationDuration:1.0];
     
    //要动画改变的属性
    self.view.alpha = 0.0;
    self.view.frame = CGRectMake(10, 10, 50, 50);
     
    [UIView commitAnimations];

那么被 beginAnimations 和  commitAnimations 框起来的代码就会让你产生动画效果,这种方式像是数据库中的事物编程一样。

还有另一种编程方式,使用代码块,对于常常书写 JS 代码的同志会比较适应,还是来个简单的代码片段:

1
2
3
4
5
    [UIView animateWithDuration:1.0
                     animations:^{
                         self.view.alpha = 0.0;
                         self.view.frame = CGRectMake(10, 10, 50, 50);
                     }];

对于不太复杂的动画,上面的写法很精练,因为只有一条语句,如果动画太过复杂了,写在这样一条语句中就会显得冗长了,对于代码调试没那么方便。

animateWithDuration 有三个重载方法:

比如我们用最后面那个重载方法,可以比 beginAnimations...commitAnimations 更轻松的实现动画完后执行的动作,如:

01
02
03
04
05
06
07
08
09
10
    [UIView animateWithDuration:1.0
                          delay: 0.0
                        options: UIViewAnimationOptionCurveEaseIn
                     animations:^{
                         self.view.alpha = 0.0;
                         self.view.frame = CGRectMake(10, 10, 50, 50);
                     }
                     completion:^(BOOL finished){
                         NSLog(@"Do something after the animation.");
                     }];

再回头看看 beginAnimations...commitAnimations 该如何实现上面同样的行为:

01
02
03
04
05
06
07
08
09
10
11
12
13
    [UIView beginAnimations:nil context: nil];
    [UIView setAnimationDuration:1.0];
     
    [UIView setAnimationDelay:0.0];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
     
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(animationStopped)];
     
    self.view.alpha = 0.0;
    self.view.frame = CGRectMake(10, 10, 50, 50);
     
    [UIView commitAnimations];

还要给当前类加一个方法 animationStopped:

1
2
3
-(void) animationStopped {
    NSLog(@"Do something after the animation.");
}

代码是多些,但是 beginAnimations...commitAnimations 编程方式是全能的,而 animateWithDuration 是有局限性的,因为它的目的就是让编写代码更简洁。在 animateWithDuration 中只提供了 completion 代码块,意即在动画完成后执行的动作,而要达成

[UIView setAnimationWillStartSelector:@selector(animationWillStart)]

这样的在动画即将启动之前的动作却是无能为力,还有些动画设置也是 animateWithDuration 做不到。所以一旦你先前用 animateWithDuration  实现的动画方式要增加稍复杂的功能而不得不用 beginAnimations...commitAnimations 来改写时,付出就大了。

该用哪种方式,只能自己斟酌吧。

关于 UIView 的动画请参考官方文档:Animations

转一篇简洁的UIView动画编程方法的更多相关文章

  1. 第七篇、使用UIView的animateWithDuration方法制作简易动画

    import UIKit class LolitaCircleButton: UIButton { private var color: UIColor private var imageURL: S ...

  2. iOS开发——动画编程Swift篇&(二)UIView转场动画

    UIView转场动画 // MARK: - UIView动画-过度动画 var redView:UIView? var blueView:UIView? // enum UIViewAnimation ...

  3. iOS开发——动画编程Swift篇&(一)UIView基本动画

    UIView基本动画 // MARK: - UIView动画 ------------------------------------- // MARK: - UIView动画-淡入 @IBActio ...

  4. iOS动画篇:UIView动画

    iOS的动画效果一直都很棒很,给人的感觉就是很炫酷很流畅,起到增强用户体验的作用.在APP开发中实现动画效果有很多种方式,对于简单的应用场景,我们可以使用UIKit提供的动画来实现. UIView动画 ...

  5. iOS开发CoreAnimation解读之一——初识CoreAnimation核心动画编程

    iOS开发CoreAnimation解读之一——初识CoreAnimation核心动画编程 一.引言 二.初识CoreAnimation 三.锚点对几何属性的影响 四.Layer与View之间的关系 ...

  6. 个人学习对UIView动画的总结

    我的博客之前已经开通五个月了,但是一直没有写东西.一是不敢写,二是也不知道写啥.毕竟是一个刚刚入行大半年的菜鸟,现在总想通过各种办法提高自己.之前总感觉用到一些东西,只是当时搞懂了一点,加上并没有总结 ...

  7. iOS开发之动画编程的几种方法

    iOS开发之动画编程的几种方法 IOS中的动画总结来说有五种:UIView<block>,CAAnimation<CABasicAnimation,CATransition,CAKe ...

  8. “AS3.0高级动画编程”学习:第二章转向行为(下)

    在上一篇里,我们学习了“自主角色”的一些基本行为:寻找(seek).避开(flee).到达(arrive).追捕(pursue).躲避(evade).漫游(wander).这一篇将继续学习其它更复杂, ...

  9. “AS3.0高级动画编程”学习:第三章等角投影(上)

    什么是等角投影(isometric)? 原作者:菩提树下的杨过出处:http://yjmyzz.cnblogs.com 刚接触这个概念时,我也很茫然,百度+google了N天后,找到了一些文章: [转 ...

随机推荐

  1. MVC实用架构设计(三)——EF-Code First(4):数据查询

    前言 首先对大家表示抱歉,这个系列已经将近一个月没有更新了,相信大家等本篇更新都等得快失望了.实在没办法,由于本人水平有限,写篇博客基本上要大半天的时间,最近实在是抽不出这么长段的空闲时间来写.另外也 ...

  2. Snapshot Volume 操作 - 每天5分钟玩转 OpenStack(58)

    Snapshot 可以为 volume 创建快照,快照中保存了 volume 当前的状态,以后可以通过 snapshot 回溯.snapshot 操作实现比较简单,流程图如下: 向 cinder-ap ...

  3. AngularJS之指令中controller与link(十二)

    前言 在指令中存在controller和link属性,对这二者心生有点疑问,于是找了资料学习下. 话题 首先我们来看看代码再来分析分析. 第一次尝试 页面: <custom-directive& ...

  4. Util应用程序框架公共操作类(一):数据类型转换公共操作类(介绍篇)

    本系列文章将介绍一些对初学者有帮助的辅助类,这些辅助类本身并没有什么稀奇之处,如何能发现需要封装它们可能更加重要,所谓授之以鱼不如授之以渔,掌握封装公共操作类的技巧才是关键,我会详细说明创建这些类的动 ...

  5. iOS开发之SQLite-C语言接口规范(一)——Ready And Open Your SQLite

    为什么要搞一搞SQLite的C语言接口规范呢? 因为在做iOS开发中难免会遇到操作数据库的情况,你可以使用第三方的FMDB等,或者使用CoreData.但我们还是有必要去搞清楚如何去使用SQLite的 ...

  6. 关于MVC EF架构及Repository模式的一点心得

    一直都想写博客,可惜真的太懒了或者对自己的描述水平不太自信,所以...一直都是不想写的状态,关于领域驱动的东西看了不少,但是由于自己水平太差加上工作中实在用不到,所以一直处于搁置状态,最近心血来潮突然 ...

  7. jQuery-1.9.1源码分析系列(四) 缓存系统

    先前在分析Sizzle的时候分析到Sizzle有自己的缓存机制,点击这里查看.不过Sizzle的缓存只是对内使用的(内部自己存,自己取).接下来分析jQuery可以对外使用的缓存(可存可取). 首先需 ...

  8. 你不知道的HttpHandler相关知识

    一.关于IHttpHandler.IsReusable 很多人不明白,这哥们到底干嘛的,估计是微软最初的一个想法--让一个对象可以一直不断地被重复使用 ,但这个想法不成熟,会带来很多隐藏问题,一个对象 ...

  9. DevExpress ComboBoxEdit 添加值

    今天在使用ComboBoxEdit 这个控件的时候,不知道怎么添加值. 在官网上找到代码.在这里做个记录 ComboBoxEdit combo = new ComboBoxEdit(); ComboB ...

  10. 设计模式(四)抽象工厂模式(Abstract Factory Pattern)

    一.引言 在上一专题中介绍了工厂方法模式,工厂方法模式是为了克服简单工厂模式的缺点而设计出来的,简单工厂模式的工厂类随着产品类的增加需要增加额外的代码,而工厂方法模式每个具体工厂类只完成单个实例的创建 ...