close
当前位置: 物联网在线 > 技术文库 > ios >

如何使用iOS 10的UIViewPropertyAnimator做动画

iOS 10 带来了一大票有意思的很特性,像 UIViewPropertyAnimator,它是一个改善动画处理的全新的类。 这个视图属性动画完全颠覆了我们已经习惯的流程,能够为动画逻辑添加更精细的控制。

一个简单的动画

让我们来看看如何通过一个简单的动画改变视图的中心点属性。

let animator = UIViewPropertyAnimator(duration: 1.0, curve: .easeOut){ AView.center = finalPoint } animator.startAnimation()

如何使用iOS 10的UIViewPropertyAnimator做动画

至少有3点需要注意:

1) 这个动画是通过闭包来定义的,与UIView 动画类的“UIView.animation(duration:…)”很相似。

2) 返回一个对象,即动画创建者。

3)这个动画不是立刻开始的,而是通过 `startAnimation()`方法触发的。

动画状态

我们对一个元素执行动画操作方式的主要变化与以下事实有关:一个属性动画器包含一整套状态机逻辑。通过`UIViewAnimating`协议实现的功能以一种简单明了的方式管理动画的状态,而这些状态又是通过`startAnimation`, `pauseAnimation` 和 `stopAnimation`函数来实现的。调用这些方法我们可以更新状态的值,使之能在`active`,`inactive`和`stopped`之间转换。

如何使用iOS 10的UIViewPropertyAnimator做动画

当动画开始或者暂停时,动画的状态就是`活跃状态`;当动画已被初始化但是还未开始或者动画已完成,它就是`非活跃状态`。需要注意的是 在`非活跃状态`和`停止态`之间有一点点不同。当动画因停止命令而完成或者它真的已经完成后,状态会变成`停止态`,动画器内部会调用方法`finishAnimation(at:)` 来标记动画 已完成,将状态设置为`非活跃状态`,并最终调用完成的代码块。

动画的可选项

可能你已经在前面的例子里注意到,和动画的 block一起,我们定义了两个参数:动画时长和动画曲线,一个UIViewAnimationCurve实例,代表着最常见的曲线(easeIn,easeOut,linear或easeInOut)。 

如果想获得对动画曲线的更多控制,你可以使用由两个控制点定义的贝塞尔曲线。

let animator = UIViewPropertyAnimator( duration: 1.0, point1: CGPoint(0.1,0.5), point2: CGPoint(0.5, 0.2){ AView.alpha = 0.0 }

如何使用iOS 10的UIViewPropertyAnimator做动画

(如果一条贝塞尔曲线依然不够,你甚至可以使用[ UITimigCurveProvider ]来指定一条完全自定义的曲线)

另一个可以传给构造器的有意思的参数是 阻尼系数值。用法与UIView 的动画方法类似,你可以定义出弹簧效果,阻尼系数的取值范围是0到1.

let animator = UIViewPropertyAnimator( duration: 1.0, dampingRatio:0.4){ AView.center = CGPoint(x:0, y:0) }

如何使用iOS 10的UIViewPropertyAnimator做动画

延迟动画的执行也非常简单,只需要调用带有`afterDelay`参数的`startAnimation`方法即可。

animator.startAnimation(afterDelay:2.5)

动画的block

`UIViewPropertyAnimator` 采用的是能够为动画器提供很多有趣能力的`UIViewImplicitlyAnimating`协议。例如,除了在初始化的时候指定的block外,你还可以指定多个动画block。

// Initialization let animator = UIViewPropertyAnimator(duration: 2.0, curve: .easeOut){ AView.alpha = 0.0 } // Another animation block animator.addAnimation{ Aview.center = aNewPosition } animator.startAnimation()

如何使用iOS 10的UIViewPropertyAnimator做动画

你还可以向运行中的动画添加动画块,该动画块将立即使用剩余时间作为新动画的持续时间来执行。

与动画流交互

正如我们已提过的那样,我们可以通过调用`startAnimation`, `pauseAnimation` 和 `stopAnimation`轻松地与动画流交互。动画的默认流(从起始点到结束点),可以通过`fractionComplete`属性更改。这个值表示动画完成的百分比,取值范围是0 到 1。你能够修改这个值来像你期望的那样驱动流(例如:用户可能会用滑块或滑动手势实时地修改`fraction`)。

animator.fractionComplete = slider.value

某些情形下,你可能希望在动画运行完毕时执行一些操作。 `addCompletion` 方法能让你添加一个(当动画完成时会被触发的)代码块。

animator.addCompletion { (position) in print("Animation completed") }

`position`参数是一个 `UIViewAnimatingPosition`类型的值,它有三个枚举值,分别代表动画是在开始停止,结束后停止,还是当前位置停止。 通常你都会收到结束的枚举值。

(译者注:`UIViewAnimatingPosition`的三个枚举值分别是`end`,`start`,`current`)

这就是这份快速指南的全部内容啦。


(责任编辑:ioter)

用户喜欢...

详解苹果Core ML:如何为iOS创建机器学习应用?

在昨天开幕的 WWDC 2017 开发者大会上,苹果宣布了一系列新的面向开发者的机器学习 API,包括面部识别的视觉 API、自然语言处理 API,这些 API 集成了苹果所谓的 Core ML 框架;参阅机器之心报...


如何打造易扩展的高性能图片组件

内容提要 图片组件可以说是app开发中使用最多的组件之一,它既简单也不简单,如何设计和开发一个具有高扩展性,高性能的图片组件呢?本次分享将会从架构设计到性能优化等多方面,全...


iOS监控:资源使用

应用性能的衡量标准有很多,从用户的角度来看,卡顿是最明显的表现,但这不意味看起来不卡顿的应用就不存在性能问题。从开发角度来看,衡量一段代码或者说算法的标准包括空间复杂度...


iOS高可控性日历基础组件-SKCalendarView的使用和实现思路的分享

SKCalendarView是一个高可控性的日历基础组件,为了提高应用的自由度,默认只提供了日历部分的视图封装,但不涵盖切换月份按钮、年月分显示等非关键性控件,但请不要担心,SKCalendarView为...


如何写出一个丝滑的图片浏览器

那时,我想要一个这样的图片浏览器: 从小图进入大图浏览时,使用转场动画 可加载网络图片,且过渡自然,不阻塞操作 可各种姿势玩弄图片,且过渡自然,不阻塞操作 可以在往下拉时,...


快速入门指南:使用 UIViewPropertyAnimator 做动画

iOS 10 带来了一堆非常有意思的新特性,例如 UIViewPropertyAnimator 。这是一个能够改善动画处理方式的新类。 它彻底改变了我们所习惯的工作流,为动画逻辑添加了一个更为精细的控制手段。...


iOS开源-轻量级 JSON 转 Model 框架,使用链式编程,无侵入

SuperKVC is a light-weight injection framework to convert JSON to Model. SuperKVC has its own config DSL which provides a chainable way of describing your injection config concise and readable. SuperKVC supports iOS and macOS. Samples are at the Su...


iOS 使用输入框的inputAccessoryView属性实现键盘上添加视图

在开发应用程序时会经常用到输入消息并发送消息的功能,比如今日头条或者UC头条这些软件底部都会有,如何想向这些应用一样点击UITextField或者UITextView就可以弹出键盘并在键盘上也能加上...


iOS:如何捕获异常?

今天在ios高级群,有朋友问到iOS的异常捕捉的问题,这一块以前也没有研究过,趁此机会研究了一把。并写了一个demo,如有需要可以在文章最下面去下载。 在阅读文章之前,建议大家在阅读...


Weex 是如何在 iOS 客户端上跑起来的

前言 2016年4月21日,阿里巴巴在Qcon大会上宣布跨平台移动开发工具Weex开放内测邀请。Weex能够完美兼顾性能与动态性,让移动开发者通过简捷的前端语法写出Native级别的性能体验,并支持iOS、...