转一篇简洁的UIView动画编程方法
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 有三个重载方法:
animateWithDuration:animations:animateWithDuration:animations:completion:animateWithDuration:delay:options:animations:completion:
比如我们用最后面那个重载方法,可以比 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动画编程方法的更多相关文章
- 第七篇、使用UIView的animateWithDuration方法制作简易动画
import UIKit class LolitaCircleButton: UIButton { private var color: UIColor private var imageURL: S ...
- iOS开发——动画编程Swift篇&(二)UIView转场动画
UIView转场动画 // MARK: - UIView动画-过度动画 var redView:UIView? var blueView:UIView? // enum UIViewAnimation ...
- iOS开发——动画编程Swift篇&(一)UIView基本动画
UIView基本动画 // MARK: - UIView动画 ------------------------------------- // MARK: - UIView动画-淡入 @IBActio ...
- iOS动画篇:UIView动画
iOS的动画效果一直都很棒很,给人的感觉就是很炫酷很流畅,起到增强用户体验的作用.在APP开发中实现动画效果有很多种方式,对于简单的应用场景,我们可以使用UIKit提供的动画来实现. UIView动画 ...
- iOS开发CoreAnimation解读之一——初识CoreAnimation核心动画编程
iOS开发CoreAnimation解读之一——初识CoreAnimation核心动画编程 一.引言 二.初识CoreAnimation 三.锚点对几何属性的影响 四.Layer与View之间的关系 ...
- 个人学习对UIView动画的总结
我的博客之前已经开通五个月了,但是一直没有写东西.一是不敢写,二是也不知道写啥.毕竟是一个刚刚入行大半年的菜鸟,现在总想通过各种办法提高自己.之前总感觉用到一些东西,只是当时搞懂了一点,加上并没有总结 ...
- iOS开发之动画编程的几种方法
iOS开发之动画编程的几种方法 IOS中的动画总结来说有五种:UIView<block>,CAAnimation<CABasicAnimation,CATransition,CAKe ...
- “AS3.0高级动画编程”学习:第二章转向行为(下)
在上一篇里,我们学习了“自主角色”的一些基本行为:寻找(seek).避开(flee).到达(arrive).追捕(pursue).躲避(evade).漫游(wander).这一篇将继续学习其它更复杂, ...
- “AS3.0高级动画编程”学习:第三章等角投影(上)
什么是等角投影(isometric)? 原作者:菩提树下的杨过出处:http://yjmyzz.cnblogs.com 刚接触这个概念时,我也很茫然,百度+google了N天后,找到了一些文章: [转 ...
随机推荐
- 深入理解DOM事件类型系列第三篇——变动事件
× 目录 [1]删除节点 [2]插入节点 [3]特性节点[4]文本节点 前面的话 变动(mutation)事件能在DOM中的某一部分发生变化时给出提示,这类事件非常有用,但都只能使用DOM2级事件处理 ...
- lintcode最长回文子串(Manacher算法)
题目来自lintcode, 链接:http://www.lintcode.com/zh-cn/problem/longest-palindromic-substring/ 最长回文子串 给出一个字符串 ...
- EF循环迭代导致如此严重的性能丢失,你知道?
前言 在工作当中呢,没怎么用到过EF,所以为了遗忘这一部分知识,偶尔会去写写小的demo,偶然机会在EF循环迭代中发现居然影响性能这么严重,当我们在用时或许大概也许可能都曾这样写过,但是你注意到了吗, ...
- T-Sql(五)xml操作
t-sql中的xml操作在我们平时做项目的过程中用的很少,因为我们处理的数据量很少,除非一些用到xml的地方,t-sql中xml操作一般用在数据量很大,性能优化的地方,当然我在平时做项目的时候也是没用 ...
- SQLServer 2012重启服务后,自增1的标识列一次增长了1000左右
sql2012我重启了下sql服务,然后自增列Id居然一下子跳了1000,怎么回事啊? 如果第一条数据是1,我重启服务,再添加就是1001,如果继续添加不重启服务的话就是1002,如果再次重启的话 ...
- iOS 使用EZAudio库生成wav出错的情况
使用EZAudio库 录M4A格式可以参考该库例子中的代码. 录wav格式得改下源码.看下面的代码 AVAudioSession *session = [AVAudioSession sharedIn ...
- 如何获取byte的各个bit值以及常见位操作
项目中通过信号采集板的数据获取车上仪表盘指示灯的信息,将接收到的数据转成byte后,还要将每一个Byte的各个Bit值分离出来,这样才知道每个bit的值代表的具体信息.这里记录下如何获取byte的各个 ...
- spring4+hibernate4+struts2项目整合的步骤及注意事项
首先,在整合框架之前,我们需要知道Spring框架在普通Java project和Web project中是略有不同的. 这个不同地方就在于创建IOC容器实例的方式不同,在普通java工程中,可以在m ...
- Spring学习笔记--环境搭建和初步理解IOC
Spring框架是一个轻量级的框架,不依赖容器就能够运行,像重量级的框架EJB框架就必须运行在JBoss等支持EJB的容器中,核心思想是IOC,AOP,Spring能够协同Struts,hiberna ...
- virtualbox搭建ubuntu server nginx+mysql+tomcat web服务器1 (未完待续)
virtualbox搭建ubuntu server nginx+mysql+tomcat web服务器1 (未完待续) 第一次接触到 linux,不知道linux的确很强大,然后用virtualbox ...