上一篇文章中介绍了 UIKit 中一些基础动画,这些动画足够应付普通的动画交互。但是作为开发者仅仅掌握基础用法显然是不够的,我们需要更强大的武器来应对将来可能的复杂场景。接下来我们来看看 UIView 的进阶动画:Transitions、Keyframe Animations。

Transitions

在上一篇文章中介绍了基于属性修改实现的动画,但是如果需要你实现视图的添加和移除的交互动画呢?当然你可以使用基础动画实现,但是这里将介绍新的动画类型 - Transitions。不同于基础动画通过在起始和结束状态之间的时间线上插值的实现过程,Transitions 会采用一种更为自然的方式来展现动画过程。

上面的效果图中:我们翻转了头像视图,添加了红色视图然后又将其替换为蓝色视图。主要的代码实现如下:

// 头像翻转
UIView.transition(from: backView!, to: avatorView, duration: 1, options: [.transitionCrossDissolve], completion: nil)// 添加红色视图
UIView.transition(with: animationContainserView!, duration: 1, options: [.transitionCrossDissolve], animations: {self.animationContainserView!.addSubview(redView)
}, completion: { finished inlet blueView = UIView.init(frame: CGRect.init(x: 0, y: 0, width: 60, height: 60))blueView.backgroundColor = UIColor.blue// 替换红色视图UIView.transition(from: redView, to: blueView, duration: 1, options: [.transitionCrossDissolve], completion: nil)})

其中第一个函数中,我们将 backView 从其父视图中移除,并将 avatorview 添加进去。而第二个函数中我们将红色视图 newView 添加到参数 animationContainserView 代表的视图中。其中控制动画过渡效果的是
options 中的参数,其可与之前基本动画中的选项进行组合,具体参数意思:

  1. transitionFlipFromLeft 以垂直方向为轴从左到右翻转

  2. transitionFlipFromRight 以垂直方向为轴从右到左翻转

  3. transitionFlipFromTop 以水平方向为轴从上往下翻转

  4. transitionFlipFromBottom 以水平方向为轴从下往上翻转

  5. transitionCurlUp 右下角往后翻书效果

  6. transitionCurlDown 右下角往前翻书效果

  7. transitionCrossDissolve 交叉消失

Keyframe

前面那么介绍的那么多动画大多都可以看作是单一的线形动画,但是对于类型飞机起降这样的复杂动画来说则远远不够。其实动画就是很多图片在时间线上组成的关键帧组合,如果能对其中某些关键帧进行提取并组合那么灵活性将大大提高。万幸的是 Apple 早就为我们做好了一切,先看效果图:

这里我们主要关注的是飞机起降过程的动画实现,其他动画后面又机会再讲。真实的起降过程远比效果图复杂,但是这里我们进行了简化。起飞过程大致如下图所示:先平飞、然后调整角度、然后快速拉升。

知道了整个动画的几个关键帧我们就可以进行如下代码实现了:

UIView.animateKeyframes(withDuration: 1.5, delay: 0.0, options: [], animations: {//add keyframesUIView.addKeyframe(withRelativeStartTime: 0.0, relativeDuration: 0.25, animations: {self.planeImage.center.x += 80.0self.planeImage.center.y -= 10.0})UIView.addKeyframe(withRelativeStartTime: 0.1, relativeDuration: 0.4) {self.planeImage.transform = CGAffineTransform(rotationAngle: CGFloat(-M_PI_4/2))}UIView.addKeyframe(withRelativeStartTime: 0.25, relativeDuration: 0.25) {self.planeImage.center.x += 100.0self.planeImage.center.y -= 50.0self.planeImage.alpha = 0.0}UIView.addKeyframe(withRelativeStartTime: 0.51, relativeDuration: 0.3) {self.planeImage.center = CGPoint(x: 0.0, y: originalCenter.y - 40)self.planeImage.transform = CGAffineTransform(rotationAngle: CGFloat(M_PI_4/2))}UIView.addKeyframe(withRelativeStartTime: 0.75, relativeDuration: 0.45) {self.planeImage.transform = CGAffineTransform.identityself.planeImage.alpha = 1.0self.planeImage.center = originalCenter}}, completion: nil)

在函数 animateKeyframes 中我们依次添加了滑跑、调整角度、快速拉升、调整降落位置和角度、降落这五个关键帧,而每一个关键帧中的动画设计几乎与基础动画一样简单。所以只要我们能够对类似起降这样复杂动画的关键帧进行很好的提取和组合,那么一切都不在话下了。

总结

UIKit 框架中的动画大部分都在这篇文章中介绍,还有一些新的动画特性后面再将。接下来文章中将会把目光投入到 Core Animations 中,内容将会在之前的基础上探索更多动画相关的特性。Let's Go!

UIView 动画进阶相关推荐

  1. 【动画1】UIView动画

    讲一下动画.将分为以下5篇博客. 一)UIView动画 二)Layer动画 三)3D动画 四)转场动画 五)第三方动画框架 相关代码:https://github.com/dolacmeng/Anim ...

  2. (0034) iOS 开发之UIView动画(过渡效果)

    UIView视图的动画功能,可以使在更新或切换视图时有放缓节奏.产生流畅的动画效果,进而改善用户体验.UIView可以产生动画效果的变化包括: 位置变化:在屏幕上移动视图. 大小变化:改变视图框架(f ...

  3. GIF动画,菊花动画,UIView动画,CoreAnimation动画(CALayer动画)的用法

    1.GIF动画 1 // 创建一个显示图片的imageView // viewController创建 2 UIImageView *showGifImageView = [[UIImageView ...

  4. iOS之UIview动画

    一.UIView动画(首尾) 1.简单说明 UIKit直接将动画集成到UIView类中,当内部的一些属性发生改变时,UIView将为这些改变提供动画支持 执行动画所需要的工作由UIView类自动完成, ...

  5. iOS 动画总结----UIView动画

    1.概述 UIKit直接将动画集成到UIView类中,实现简单动画的创建过程.UIView类定义了几个内在支持动画的属性声明,当这些属性发生改变时,视图为其变化过程提供内建的动画支持. 执行动画所需要 ...

  6. iOS动画:UIView动画和CALayer动画(CABasicAnimation、CAKeyframeAnimation的使用)

    iOS中的动画有两种实现方式,一种是UIView来实现动画,另一种动画是通过CALayer来实现,下面介绍两种动画的简单实现: 一.UIView动画的实现 UIView使用Context来实现动画 关 ...

  7. ios uiview动画_iOS UIView动画

    ios uiview动画 In this tutorial, we'll be animating our UI Views in various ways in the iOS Applicatio ...

  8. iOS核心动画以及UIView动画的介绍

    我们看到很多App带有绚丽狂拽的特效,别出心裁的控件设计,很大程度上提高了用户体验,在增加了实用性的同时,也赋予了app无限的生命力.这些华丽的效果很多都是基于iOS的核心动画原理实现的,本文介绍一些 ...

  9. web前端技术(二)之动画进阶

    web前端技术(二)之动画进阶 目录 web前端技术(二)之动画进阶 前言 一.web前端动画是什么 二.2D转换标签(transforms) 1. translate() 2.rotate() 3. ...

最新文章

  1. java ssh文件下载_Java使用SSH从远程服务器下载文件
  2. python下载word文件-python-docx操作word文件(*.docx)
  3. 含有负边的图的最短路径(Bellman_ford算法)
  4. [博客园公告]编辑器改进(二)
  5. mysql字符串逆时针旋转180度_mysql 函数示例(转)
  6. winform中UI设计分辨率问题
  7. 用javascript读取xml,并进行修改xml数据,解决保存没有权限问题
  8. 【147天】尚学堂高淇Java300集视频精华笔记(108-109)
  9. kafka maven没有下载_Kafka 系列(三)——Kafka 生产者详解
  10. html loader 路径,Webpack html-loader提取链接和脚本
  11. java同步通信_java-线程-线程同步通信技术
  12. 064 import和from...import
  13. 马尔科夫决策过程(MDP) : GridWord(DP)
  14. 网络嗅探器c语言代码,基于C 网络嗅探器的设计与实现-精品.doc
  15. Eclipse中jsp文件ISO-8859-1编码转换为UTF-8或者GBK方法
  16. matlab 神经网络train均方误差,MATLAB搭建bp神经网络的误差特别大,但R2的值也大,求解帮我看看我的网络哪里出问题了...
  17. 定义char dog[]=wang\0miao;那么sizeof(dog)与strlen(dog)分别是多少:
  18. 跟着SY速学Ubuntu系列一:作为程序员,安装Ubuntu后我做的事情。
  19. 夫妻分居申办上海户口全攻略
  20. SCU3 表日志记录,RZ10设置rec/clien需要重启服务器

热门文章

  1. C#模拟http 发送post或get请求
  2. 程序员这口饭-职业规划解决方案
  3. SQL Server 无法生成 FRunCM 线程。请查看 SQL Server 错误日志和 Windows 事件日志(转)...
  4. Avenger v1.0.6.0
  5. swoole 清除定时器提示no timer
  6. php_mvc实现步骤五
  7. 包转发、吞吐量、背板带宽计算
  8. 51nod 1344 走格子【贪心/前缀和】
  9. 软件项目验收的准备工作
  10. [].slice.call(arguments)模拟实现 Array.of