Swift - 异步编程库PromiseKit使用详解7(动画的扩展)
作者:hangge | 2018-12-17 08:10
APP 开发时除了要实现各种业务功能外,也少不了各种动画效果,PromiseKit 同样也对其进行了扩展,方便我们使用。
八、动画的扩展
1,安装配置
(1)首先要安装 PromiseKit 库 ,具体步骤可以参考我之前的文章:
(2)接着安装 PromiseKit 的 UIKit 扩展库,从 GitHub 上下载最新的代码:
(3)将下载下来的源码包中 PMKUIKit.xcodeproj 拖拽至你的工程中


(5)最后,在需要使用扩展的地方将其 import 进来就可以了
import PMKUIKit
2,Animate 动画样例
(1)效果图
- 程序启动后在屏幕上会有个黑色方块从左向右移动。
- 并且在移动的过程中,方块会从透明逐渐变成不透明。
- 在动画结束后(方块移动到最右侧),控制台输出结束信息。

(2)样例代码
import UIKit
import PromiseKit
import PMKUIKit
class ViewController: UIViewController {
// 方块
var block:UIView!
override func viewDidLoad()
{
super.viewDidLoad()
//创建方块
block = UIView(frame:CGRect(x:0, y:120, width:40, height:40))
block.backgroundColor = UIColor.darkGray
block.alpha = 0 //默认为透明的
self.view.addSubview(block)
//播放动画
playAnimation()
}
//播放动画
func playAnimation() {
UIView.animate(.promise, duration:1, delay: 0.4, options: [.curveEaseOut]) {
self.block.frame.origin.x = self.view.bounds.width - self.block.frame.width
self.block.alpha = 1
}.done { success in
print("动画结束")
}
}
}
3,Transitions 过渡动画样例
过渡动画强调的是 view 改变内容,它分成如下两种情况:单个 view 的过渡变化,两个 view 间的过渡切换。
(1)单个 view 的过渡动画
- 下面样例每次点击按钮,按钮会进行一次翻转。
- 并且每次翻转时,按钮颜色会变化一次。
- 翻转完毕后,控制台输出结束信息。

import UIKit
import PromiseKit
import PMKUIKit
class ViewController: UIViewController {
var reverse = false
var button:UIButton!
override func viewDidLoad()
{
super.viewDidLoad()
//创建一个按钮,用来点击播放动画
button = UIButton(type:.system)
button.frame = CGRect(x:10, y:80, width:100, height:30)
button.setTitle("播放动画", for:.normal)
button.addTarget(self,action:#selector(ViewController.play),
for:.touchUpInside)
button.setTitleColor(.white, for: .normal)
button.backgroundColor = .blue
self.view.addSubview(button)
}
//切换视图并播放动画
@objc func play(){
reverse = !reverse
UIView.transition(.promise, with: self.button, duration: 10,
options: [.transitionFlipFromLeft]){
self.button.backgroundColor = self.reverse ? .orange : .blue
}.done { success in
print("动画结束")
}
}
}
(2)两个 view 间的过渡动画
当调用两个 view 切换的动画方法时 ,第一个 view 会被第二个 view 替换掉。整个 transition 动画会在他们的 superview 进行动画。这里有如下两种可能的情况:
- 删除一个 subview,添加另一个:
如果.showHideTransitionViews 不包含在 options 中 ,那么第二个 view 在我们开始动画时,并不在视图层级。transition 动画 remove 将第一个 view 从 superview 上 remove 掉,将第二个 view 添加到相同的 superview 上。 - 隐藏一个 subview,显示另一个:
如果.showHideTransitionViews 包含在 options 中,那么两个 subview 一开始都在视图层级中。第一个 view 的 isHidden 是 false,第二个为 true。 transition 动画会对调两个 view 的 isHidden 属性。
- 下面样例每次点击屏幕,整个视图会翻翻转一次(红蓝两个视图切换)。
- 翻转完毕后,控制台输出结束信息。

import UIKit
import PromiseKit
import PMKUIKit
class ViewController: UIViewController {
//红色视图
var redView:UIView!
//蓝色视图
var blueView:UIView!
//标记当前的视图
var currentView:UIView!
override func viewDidLoad()
{
super.viewDidLoad()
redView = UIView(frame: CGRect(x:20, y:100, width:280, height:400))
redView.backgroundColor = UIColor.red
self.view.insertSubview(redView, at: 0)
blueView = UIView(frame: CGRect(x:20, y:100, width: 280, height:400))
blueView.backgroundColor = UIColor.blue
self.view.insertSubview(blueView, at: 1)
//初始时显示的是蓝色视图
currentView = blueView
}
//点击切换两个红蓝视图
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
let nextView = currentView == blueView ? redView : blueView
UIView.transition(.promise, from: currentView, to: nextView!, duration: 1,
options: [.transitionFlipFromLeft])
.done { success in
self.currentView = nextView
print("动画结束")
}
}
}
4,perform 系统动画样例
使用 perform 方法可以使用系统默认动画。不过可惜的是,目前苹果只提供一个 delete 动画可以使用。
(1)效果图
- 点击按钮后该按钮自动被删除,同时删除的过程中还有动画效果。
- 动画播放完毕后,控制台输出结束信息。

(2)样例代码
import UIKit
import PromiseKit
import PMKUIKit
class ViewController: UIViewController {
var button:UIButton!
override func viewDidLoad()
{
super.viewDidLoad()
//创建一个按钮,用来点击播放动画
button = UIButton(type:.system)
button.frame = CGRect(x:10, y:80, width:100, height:30)
button.setTitle("播放动画", for:.normal)
button.addTarget(self,action:#selector(ViewController.play),
for:.touchUpInside)
button.setTitleColor(.white, for: .normal)
button.backgroundColor = .blue
self.view.addSubview(button)
}
//播放动画
@objc func play(){
UIView.perform(.promise, animation: .delete, on: [button], animations:nil)
.done { finished in
print("动画结束")
}
}
}
全部评论(0)