说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

iOS UIView动画实践(三):Transition Animation

HTML文档下载 WORD文档下载 PDF文档下载
本文为iOS UIView动画实践系列第三篇。在讲解了如何创建基于动画属性的视图动画以及让UI变得鲜活的弹簧动画之后,本文作者介绍了过渡转变动画,以此来实现在添加或删除一个视图时能够添加相应的动画。

前言

在上两篇文章中向大家介绍了如何创建基于动画属性的视图动画,比如位置、透明度等。但是大家有没有想过添加或删除一个视图时怎样添加相应的动画呢?

当然我们可以用第一篇文章中对用户名、密码输入框的处理办法,但是还有更好的办法处理这种状况。那就是在这篇文章中将向大家介绍的过渡转变(Transition)动画。

过渡转变动画是Apple预定义的动画集,它没有更改视图某属性起始值和终止值的概念,而只需要你设定不同的动画选项即可。

添加新视图

在进行示例之前,大家需要注意一点过渡转变动画与动画属性动画的不同之处。我们在创建动画属性动画时只需要在animations闭包中添加对视图动画属性修改的代码即可,它没有作用域或作用视图的概念。而在过渡转变动画中有作用视图的概念,也就是说我们调用过渡转变动画方法时需要指定一个作用视图。

明确这点不同之后,我们对作用视图再作进一步的说明。过渡转变动画中的作用视图并不是我们的目标视图,而是目标视图的容器视图,那么大家不难想象,如果该容器视图中有多个子视图,那么这些子视图都会有过渡转变动画效果。下面用示例像大家说明。

先看看一个简单的视图结构:


很明显,我们添加了一个视图作为容器视图,并且尺寸等于屏幕尺寸。在ViewController.swift中有该容器视图的Outlet以及一个图片视图:

@IBOutlet weak var containerView: UIView!let ipadView = UIImageView(frame: CGRectMake(100, 100, 200, 151.5))

viewDidLoad()方法中给ipadView指定图片:

ipadView.image = UIImage(named: "ipad")

然后在viewDidAppear()方法中添加如下代码:

UIView.transitionWithView(self.containerView, duration: 1.5, options: .TransitionFlipFromBottom, animations: {    self.containerView.addSubview(self.ipadView)}, completion: nil)

上述代码就是我们今天的主角,过渡转变方法之一,它同样是UIView的类方法,共有五个参数:

  • view:第一个参数,也就是作用视图,一般都是容器视图。
  • duration:动画持续时间。
  • options:过渡转变动画选项,由它来确定过渡转变的具体展现形式。
  • animations:动画闭包。
  • completion:动画结束后执行该闭包中的代码。

除了第一个参数,其他四个参数大家应该都不会陌生。这段代码用文字解释出来就是将容器视图(containerView)添加子视图(ipadView)的过程使用.TransitionFlipFromBottom类型的过渡转变动画展示出来,持续时间为1.5秒。编译运行看看效果:

                                     

我们再来添加一个子视图(该子视图的初始化代码不再累赘):

UIView.transitionWithView(self.containerView, duration: 1.5, options: .TransitionFlipFromBottom, animations: {    self.containerView.addSubview(self.ipadView)    self.containerView.addSubview(self.iphoneView)}, completion: nil)

编译运行看看效果:

                                      

大家可以看到这两个子视图都依托与它们的容器视图进行了过渡转变动画。下面的列表是所有过渡转变动画的动画选项,大家可以在你们自己的项目中逐个实验:

  • .TransitionFlipFromLeft
  • .TransitionFlipFromRight
  • .TransitionCurlUp
  • .TransitionCurlDown
  • .TransitionCrossDissolve
  • .TransitionFlipFromTop
  • .TransitionFlipFromBottom

如果我们有多个目标视图,想进行不同的过渡转变动画怎么办?那我们就创建多个目标视图的容器视图,尺寸与目标视图一致,放置在合适的位置:


从上图中可以看出,我们在屏幕上放置了四个容器视图,显而易见,我们要分别对这四个容器视图添加过渡转变动画。当然容器视图里要添加什么样的视图随个人喜好。

viewDidLoad()方法中添加如下代码:

UIView.transitionWithView(self.ipadContainerView, duration: 1.5, options: [.CurveEaseOut, .TransitionFlipFromBottom], animations: {    self.ipadContainerView.addSubview(self.ipadView)}, completion: nil)UIView.transitionWithView(self.iphoneContainerView, duration: 1.5, options: [.CurveEaseOut, .TransitionFlipFromLeft], animations: {    self.iphoneContainerView.addSubview(self.iphoneView)}, completion: nil)UIView.transitionWithView(self.webContainerView, duration: 1.5, options: [.CurveEaseOut, .TransitionFlipFromRight], animations: {    self.webContainerView.addSubview(self.webView)}, completion: nil)UIView.transitionWithView(textContainerView, duration: 2, options: [.CurveEaseOut, .TransitionCrossDissolve], animations: {    self.textContainerView.addSubview(self.textView)}, completion: nil)

通过上述代码可以看出,我们对四个容器视图分别添加了过渡转变动画,并且options参数使用了.CurveEaseOut和不同的过渡转变动画选项。编译运行看看效果:

                                       

是不是有点儿意思!不过细心的朋友应该发现了,过渡转变动画的方法没有delay这个很有用的属性,这就导致过渡转变动画都是同时发生,不能设置延迟时间。不过我们可以曲线救国,自己写一个delay方法:

func delay(seconds: Double, completion:()->()) {    let popTime = dispatch_time(DISPATCH_TIME_NOW, Int64( Double(NSEC_PER_SEC) * seconds ))    dispatch_after(popTime, dispatch_get_main_queue()) {        completion()    }}

然后我们修改viewDidLoad()方法中的代码如下:

delay(0, completion: {   UIView.transitionWithView(self.ipadContainerView, duration: 1.5, options: [.CurveEaseOut, .TransitionFlipFromBottom], animations: {       self.ipadContainerView.addSubview(self.ipadView)   }, completion: nil)})delay(1, completion: {            UIView.transitionWithView(self.iphoneContainerView, duration: 1.5, options: [.CurveEaseOut, .TransitionFlipFromLeft], animations: {                self.iphoneContainerView.addSubview(self.iphoneView)                }, completion: nil) })        delay(2, completion: {            UIView.transitionWithView(self.webContainerView, duration: 1.5, options: [.CurveEaseOut, .TransitionFlipFromRight], animations: {                self.webContainerView.addSubview(self.webView)                }, completion: nil)})delay(3, completion: {            UIView.transitionWithView(self.textContainerView, duration: 2, options: [.CurveEaseOut, .TransitionCrossDissolve], animations: {                self.textContainerView.addSubview(self.textView)                }, completion: nil) })

我们将每个过渡转变动画延迟1秒进行,编译运行看看效果:

                                       

现在的效果是不是更好了呢! : ]

移除视图

过渡转变动画同样可以用来移除视图。我们在屏幕底部添加一个UIButton,当点击这个按钮的时候,通过过渡转变动画移除按钮上方的那两排字,并且改变屏幕背景色。go()方法是按钮连接在代码中的Touch Up Inside方法,在该方法中添加如下代码:

UIView.animateWithDuration(0.5, animations: {            self.view.backgroundColor = UIColor(red: 252.0/255.0, green: 155.0/255.0, blue: 65.0/255.0, alpha: 1)})

编译运行看看效果:

                                       

替换视图

在这一节我们将要学习过渡转变动画的另一个方法,替换视图方法。我设计的场景是当点击Go按钮后,除了上一节中的动画效果以外,iPad、iPhone、Web视图也会移位并且替换为别的视图,我们继续在go()方法中的添加如下代码:

UIView.animateWithDuration(1, delay: 0, options: [], animations: {     self.iphoneView.frame = CGRectMake(0, 0, 334, 72)     self.iphoneContainerView.frame = CGRectMake(26, 130, 334, 72)  }, completion: {        (flag: Bool) in                if flag {                        UIView.transitionFromView(self.iphoneContainerView, toView: self.supportIphone, duration: 0.33, options: .TransitionCrossDissolve, completion: nil)                } })        UIView.animateWithDuration(1, delay: 1, options: [], animations: {    self.ipadView.frame = CGRectMake(0, 0, 334, 72)    self.ipadContainerView.frame = CGRectMake(26, 242, 334, 72)  }, completion: {        (flag: Bool) in                if flag {                        UIView.transitionFromView(self.ipadContainerView, toView: self.supportIpad, duration: 0.33, options: .TransitionCrossDissolve, completion: nil)                }})        UIView.animateWithDuration(1, delay: 2, options: [], animations: {    self.webView.frame = CGRectMake(0, 0, 334, 72)    self.webContainerView.frame = CGRectMake(26, 354, 334, 72)}, completion: {        (flag: Bool) in                if flag {                        UIView.transitionFromView(self.webContainerView, toView: self.supportWeb, duration: 0.33, options: .TransitionCrossDissolve, completion: nil)                }})

我们来解释一下上述的代码,拿iPhone视图为例,首先通过动画属性动画改变它的尺寸大小和位置。然后在completion闭包中添加替换视图方法,该方法有五个参数:

  • fromView:被替换的视图。
  • toView:替换之后的视图。
  • duration:动画持续时间。
  • options:动画选项。
  • completion:动画执行结束后执行该闭包中的代码。

要注意的是该方法的作用视图可以是容器视图,也可以是目标视图。编译运行看看效果:

                                       

显示/隐藏视图

过渡转变动画也可以用于显示或隐藏视图,这里给出伪代码供参考:

UIView.transitionWithView(self.someContainerView, duration: 1.5, options: [.CurveEaseOut, .TransitionFlipFromBottom], animations: {    self.someView.hidden = true    // self.someView.hidden = false}, completion: nil)

结束语

过渡转变动画有很多动画选项,大家可以自行试试,找出自己喜欢的或最合适的过渡转变动画选项,并且可以尝试过渡转变动画和属性动画的组合,可以使你们的App更加有趣。好了今天就到这里。

系列阅读:

iOS UIView动画实践(一):揭开Animation的神秘面纱

iOS UIView动画实践(二):Spring Animation与人机交互


作者简介:

付宇轩(@DevTalking),从事Java中间件开发、iOS开发。主要主持开发企业级ETL中间件、BPM中间件、企业级移动应用,个人博客地址:http://www.devtalking.com。


CSDN移动将持续为您优选移动开发的精华内容,共同探讨移动开发的技术热点话题,涵盖移动应用、开发工具、移动游戏及引擎、智能硬件、物联网等方方面面,如果您有想分享的技术、观点,可通过电子邮件(tangxy#csdn.net,请把#改成@)投稿。

第一时间掌握最新移动开发相关信息和技术,请关注mobilehub公众微信号(ID: mobilehub)。


三年增四倍:如今谷歌服务占北美互联网流量四分之一 决战低功耗?Intel明年推低功耗Xeon处理器 在软件架构上增加新功能的注意事项 90后的代码界“女神”李雪:在编程中找到自己的“灵魂” 大数据之路不乏荆棘,然则其中的机遇却高于一切 iPhone销量令人意外:苹果Q3财季净利69亿美元 同比下滑 励志:12位早起的IT大佬们让小伙伴们都惊呆了 独家:苹果5周年限免神作,BADLAND开发者访谈 10亿次订阅!苹果Podcast的里程碑 免费利器Unity 4.2正式发布 支持WP8、Win8和BB10 SDCC 2013:Pinterest首位中国籍工程师两场演讲议题确定 甲骨文公布中国首届“Duke选择奖”名单 Moco、X幻想、开源中国获奖 直接拿来用,10个PHP代码片段 编程的未来 数据将成为主角 OpenCL 2.0发布,带来更强悍的异构计算能力 代码审查方式大调查 辅助工具居首(信息图) 一网打尽当下NoSQL类型、适用场景及使用公司 初创公司Treasure Data:每天处理7000亿行数据的20万次查询 豌豆荚王俊煜:将推支付SDK 与开发者3:7分成 英特尔-百度移动应用测试中心(MTC)正式启动 Intel将在2014年为数据中心用户定制低功耗SoC芯片 情绪低落?没事,让计算机来帮你! 水果生意难做 前新浪架构师徐佳转行试水挖煤 思考软件开发中的快与慢 Apache CouchDB注入新鲜血液,整合分布式技术 CSS Shapes:Web设计人员的新工具 Android 4.3正式发布:四大新功能一览 史玉柱的创业经验谈 3G门户和GO桌面:海外推广的生意经 系统级编程语言性能大PK D语言成首选 解读Facebook第二季度财报 移动业务风生水起 COM进程类组件中,在一个接口中加了一个方法,成员变量类型CString,可是不行,那该用什么? 请问那里有 motif toolkit 开发工具下载 一个mysql的问题! 出售软件源代码以及销售权! byte类型的数据如何转化成二进制数,显示给用户(如8-》0000 1000) 代征:精通vc的深圳朋友,精通网络通讯的开发和多媒体处理。 20分求助!这条警告是什么原因呀?怎么解决 ?LINK : warning LNK4089: all references to "SHELL32.dll" discarded by /OPT:REF 局域网的文件共享传输是基于什么协议的? windows and dos ??? 请问大家几个技术问题!!谁能回答阿!比较着急!:) 有没有代替VB里的PICTUREBOX 的控件,VB里的不好用?????????? 我是新手,请问JSP有些什么开发软件?比如JAVA用JBUILDER。。。 请问知道整型值a=97,什么函数可以得到"a"呢?即97->"a"通过什么函数呢? 如何将十进制数转换成二进制数 函数对象的简单问题 喜欢仙剑的朋友请进。:) 恭喜恭喜? 我想制作C++ Builder4工程的安装程序,不知道用什么软件,请大家帮忙。谢谢! 请问大家几个技术问题!!谁能回答阿! 我是ASP初学者,请求一个简单的问题,Help!!! 有没有关于installshield6的书, 快看呀!我真的要不行了! 请教大家一个术语吧! 低手问题,关于Form中的数据问题,谢了。 如何用PictureBox控件显示GIF图?特急!!!!!! 单文档多视(急!) 想学delphi中关于database方面的内容,不晓得哪本书好,大家推荐好吧? “CSDN准备推出海外图书邮购服务,首批是侯捷的著作和译作” 什么时候可以开始? 谁能介绍一下嵌入开发领域比较成熟的产品?他们的功能、性能如何 关于Autocad字体的问题 在 ActiveForm 中如何初始本地数据模块!菜鸟问题! (const char *)&p转化为delphi语言该是什么? ####我拼了命也要问出这个问题的答案########## 怎样才可以描述点击窗口右上角的“x”时所发生的事件,请给个例子,谢谢了! 哪儿有Install anywhere 4下载 庆祝kylix2001,终于知道叫什么好了,耶………… VB,请问set obj=new class 和 dim obj as new class的区别????????? install anywhere 4 哪儿有下载? GGMM,向我灌水..... 如何截获视频卡串送过来的图像。 高级程序员,在weblogic上做j2ee开发半年多,jsp一年左右,求职。 那里有PB的反编译工具? ~~~~~~大家注意了: wjyasd(即使用FPE改了钱,也绝不能忘记艰苦朴素的优良作风) 这个帐号…… 关于动态连接与静态连接的问题,送分了!!! Delphi6又多了那么多的控件。每个都要去研究么??? 哪里有RSA加密的delphi源代码下载呀? 一个WINDOWS编程的问题 bind sock return WSAENOTSOCK error! why... ...? 菜鸟问路: 一定送分 可否用PB6做触摸屏中的程序,即。。。。。。 我在wince下写一些应用,各位是做什么系统的? 读课文填表,遵循 瘦 字,看看作者是怎样把鲁迅先生的形象写具体的怎样的瘦\x05 观察位置、条件\x05怎样具体描写鲁迅先生的形象\x05 远、暗\x05\x05 走了出来\x05\x05 抽书、递书\x05\x05 面对面 \x0 赞美手指的作文 在音乐之都维也纳课文中的摇篮指什么 根据六年级课文《千百年梦圆在今朝》一文填表.时间 事件 意义明代 人类首次火箭飞行失败 横着看,如时间 事件 意义,填问号处 我手指的这篇作文怎么写 音乐之都维也纳 简介 丰子恺 手指 这篇课文的中心 模仿手指的作文 音乐之都维也纳的简介 丰子恺《手指》的原文要原文! 文章《手指》 音乐之都维也纳介绍拣重点写,越短越好.(如:面积、位置. 丰子恺的手指是什么文章属于什么类型的,比如记叙文之类的 手指 作文 苏教版五年级语文练习与测试下册15课音乐之都维也纳发展练习第2题的答案 模仿丰子恺的手指写文章急用!大哥大姐帮帮忙,好的给15分 六年级下册《手指》 课文解说,告诉我们了一个什么样的道理? 苏教版五年级下册语文第14课课文 丰子恺手指 初读课文,说说本文写了一件什么事?文章开门见山先写 ,再写 ,最后阐明 . 课文 手指大拇指形状特点不美,作者是从--------,--------,--------,这三个方面进行描写的 大家好!谁能告诉我小学五年级语文下册第15课(音乐之都维也纳)的批注!急啊! 《忆读书》主要内容 六年级下册第五课《手指》,五个手指的长处和短处及给我们的启示是什么?读了这篇课文,谈谈自己的体会! 苏教版五年级下册语文有哪些课文 感动的作文 结尾关于母爱 忆读书主要内容快, 手指 这篇课文中五个手指的性格是什么? 求一些关于父爱的作文的素材 去几个例子,别太复杂,很急,快 忆读书的主要内容 文章怎样概括主要内容? 写父爱作文的素材有没有? 忆读书这篇课文的主要内容 要用简洁的语言概括选文的内容 求《彷徨》中每篇文章的主要内容和中心思想.11篇都要哦! 有没有关于父爱和母爱的文章,诗,素材和事例之类的 用一句话来概括《忆读书》的主要内容还有好多 一,结合语境,体会下面句子中加点词语的表达效果其中有一幅画的是希金斯身穿(身穿是带点字),涉水过河,一首提(提字带点)灯笼,一手拿 记金华的双龙洞,主要内容,分段,讲解,中心思想,作者背景,文章背景…… 父爱 作文素材要你自身的,不要他人的.要新颖的,不要太俗的像关于生病被照顾的,下雨送伞的等等都不要 丰子恺的《手指》主要内容 谁能告诉这篇文章的中心思想和主要内容!看完这篇文章,相信你一定会明白保险是什么了.寿险到底是什么?寿险对人类而言:是每个人对他自己及家庭应尽的责任以及是一种支付人生必需费用 如何理解课文的主要内容 丰子恺 手指 主要内容 谁有这篇文章的主要内容和中心思想啊?是主要内容和中心思想.越简练越好! 用简单的语言把 丝绸之路 这篇课文的主要内容以及你的体会,感受写下来. 走遍天下书为侣的主要内容 这篇文章的主要内容和中心思想分别是什么?《孩子与鸟儿》张秀亚 爸爸的花儿落了的整体感知与主要内容还有我们可以从哪些细节理解与深入课文的各方面 小学五年级语文3课走遍天下书为侣的主要内容是什么 问下这篇文章的主要内容看了一部电视片,是关于埃及的.说到埃及,就不能不说金字塔.主持人极尽赞美之词赞美金字塔.对于金字塔,怎么赞美都是不过分的.末了,主持人又说:世界上只有两种 整体感知,根据课文内容默写.《爱莲说》既写了莲花的美丽,又歌颂了莲花_________的高尚品质《爱莲说》的中心句是:_________公园画展,观赏杜丹的人总比观赏其他花的人多,用《爱莲说》中的 《走遍天下书为侣》课文 《只有你才能欣赏》 我这篇文章的主要内容快,就现在! 读《黄河之水天上来》这篇课文,给你感受最深刻的是什么内容?并写一写你从中体会到了什么? 走遍天下书为侣课文《走遍天下书为侣》课文 概括《鲜花》这篇文章的主要内容!急呀! 1、手指这篇文章采用了什么的表达方法,语言怎么样 2、照样子写句子 匆匆那篇课文__有__的时候 要3个 走遍天下书为侣这篇课文中表达的主要意思是什么? 音乐之都维也纳这篇课文的中心句 读课文 填表 看不见的大力士段落 小标题 压缩空气的用途 原理 2 3 4 类似《手指》的作文在小学六年级的课文里有《手指》这篇文章,能帮我找一下类似他的文章吗?急用. 音乐之都维也纳课文的最后一句
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn