Interpolate
Interpolate 是一个强大的 Swift 插值框架,用于创建交互式手势驱动的动画。
使用方法
The
要使用 Interpolate
在您的 Swift 文件顶部导入 Interpolate。
import Interpolate
创建一个 Interpolate 对象,包含一个起始值、一个目标值和一个应用到目标对象的插值结果的应用闭包。
let colorChange = Interpolate(from: UIColor.white,
to: UIColor.red,
apply: { [weak self] (color) in
self?.view.backgroundColor = color
})
或者,您可以在数组中为插值指定多个值。Swift 编译器可能无法推断数组类型,因此最好是明确的。
let colors: [UIColor] = [UIColor.white, UIColor.red, UIColor.green]
let colorChange = Interpolate(values: colors,
apply: { [weak self] (color) in
self?.view.backgroundColor = color
})
接下来,您需要定义一种方法将所选手势的进度转换为百分比值(即介于 0.0 和 1.0 之间的 CGFloat)。
对于报告每个步骤进度的手势识别器或代理(例如 UIPanGestureRecognizer 或 ScrollViewDidScroll),您只需直接将百分比应用于 Interpolate 对象即可。
@IBAction func handlePan(recognizer: UIPanGestureRecognizer) {
let translation = recognizer.translation(in: self.view)
let translatedCenterY = view.center.y + translation.y
let progress = translatedCenterY / self.view.bounds.size.height
colorChange.progress = progress
}
对于其他类型的手势识别器,它们只报告开始和结束(例如 UILongPressGestureRecognizer),您可以具有给定持续时间的目标进度值进行直接动画。例如
@IBAction func handleLongPress(recognizer: UILongPressGestureRecognizer) {
switch recognizer.state {
case .began:
colorChange.animate(1.0, duration: 0.3)
case .cancelled, .ended, .failed:
colorChange.animate(0.0, duration: 0.3)
default: break
}
}
要停止动画
colorChange.stopAnimation()
当您完成了全部的插值后
colorChange.invalidate()
完成了!
我可以插值什么?
Interpolate 目前支持以下类型的插值
- CGPoint
- CGRect
- CGSize
- Double
- CGFloat
- Int
- NSNumber
- UIColor
- CGAffineTransform
- CATransform3D
- UIEdgeInsets
随着时间的推移,会添加更多类型。
高级用法
Interpolate 不只是用于无聊的线性插值。
为了更平滑的动画,请考虑使用以下函数之一: easeIn, easeOut, easeInOut 和 Spring。
// Spring interpolation
let shadowPosition = Interpolate(from: -shadowView.frame.size.width,
to: (self.view.bounds.size.width - shadowView.frame.size.width)/2,
function: SpringInterpolation(damping: 30.0, velocity: 0.0, mass: 1.0, stiffness: 100.0),
apply: { [weak self] (originX) in
self?.shadowView.frame.origin.x = originX
})
// Ease out interpolation
let groundPosition = Interpolate(from: CGPoint(x: 0, y: self.view.bounds.size.height),
to: CGPoint(x: 0, y: self.view.bounds.size.height - 150),
function: BasicInterpolation.easeOut,
apply: { [weak self] (origin) in
self?.groundView.frame.origin = origin
})
实际上,您可以轻松创建并使用自己的插值函数 - 所需的只是一个符合 InterpolationFunction 协议的对象。
使用 CocoaPods 设置
source 'https://github.com/CocoaPods/Specs.git'
pod 'Interpolate', '~> 1.3.0'
使用 Carthage 设置
Carthage 是一个去中心化的依赖项管理器,它自动执行将框架添加到您的 Cocoa 应用程序的过程。
您可以使用以下命令通过 Homebrew 安装 Carthage
$ brew update
$ brew install carthage
要使用 Carthage 将 Interpolate 集成到您的 Xcode 项目中,请在您的 Cartfile
中指定它
github "marmelroy/Interpolate"