Interpolate 1.3.1

Interpolate 1.3.1

测试已测试
Lang语言 SwiftSwift
许可证 MIT
发布上次发布2021年1月
SPM支持 SPM

Roy Marmelstein 维护。



Interpolate - Swift interpolation for gesture-driven animations

Platforms Build Status Version Carthage compatible

Interpolate

Interpolate 是一个强大的 Swift 插值框架,用于创建交互式手势驱动的动画。

使用方法

The🔑Interpolate 的理念是 - 所有动画都是值随时间插值的结果。

要使用 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"

灵感