Ubergang 是一个用 Swift 编写的 iOS 插值引擎。
特性
- 插值数字值、UIColors 和 CGAffineTransforms
- 沿着 UIBezierPaths 插值
- 通过点进行插值
- 线性、指数、立方、二次、圆形、四次方、五次方、正弦、回弹、弹跳和弹性缓动
- 通用插值设置
- 重复和Yoyo插值选项
- 为强和弱插值对象引用提供内存管理
- 插值时间线
- Bezier 插值对齐路径
- 日志记录和日志级别
预览
安装
CocoaPods
platform :ios, '8.0'
use_frameworks!
pod 'Ubergang'
设置
UTweenSetup.instance.enableLogging(true)
UTweenSetup.instance.enableLogging(true, withLogger: loggerProxy)
Ubergang提供了一些基本操作的日志,如启动、停止、暂停等。它依赖于XCGLogger,这是默认使用的,但您可以通过创建一个自定义的实现了
UTweenLoggable
的日志代理来传递您偏好的任何Logger。
反转型配置
.options(.repeat(n))
.options(.yoyo)
.options(.repeat(n), .yoyo)
使用
options
,可以使反转型重复n(整数)次,也可以让它前后震动或两者结合。
- 重复将重启反转型n次,其中在每次周期中都会调用
repeatCycleChange
。 - 前后震动将在达到最终值后反转反转型。
.reference(.strong)` //(default)
.reference(.weak)
reference
确定如何处理反转型的引用计数。如果设置选项为.strong
,Ubergang将增加保留计数,如果设置为.weak
,将不会增加它。这两条规则在大多数情况下都是有效的
- 反转型不会被存储在字段变量中 ->
.strong
- 反转型被存储在字段变量中 ->
.weak
使用
启动一个简单的数值反转型(双倍)
0.tween(to:10).update({ (value:Int) in print("\(value)") }).start()
此反转型默认情况下使用默认的0到10秒的线性减震,从0到10进行,每次更新都会打印当前值。
'to' 和 'from' 使用闭包
NumericTween(id: "doubleTween")
.from({ [unowned self] in return self.position2.x }, to: { [unowned self] in return self.position1.x })
.update({ value, progress in print("update: \(value), progress: \(progress) ") })
.duration(5)
.start()
传递给'to'和'from'的闭包将始终使用闭包返回的当前值计算所有结果。
开始一个弱数值缓动(Int)
var tween: NumericTween<Int>?
func run() {
tween = 0.tween(to: 10)
.id("intTween")
.duration(5)
.update({ value in print("update: \(value)") })
.ease(.elastic(.out))
.reference(.weak)
.start()
}
此id为'intTween'的缓动从0到10,持续5秒,使用弹性缓动效果。当前值会随每次更新打印出来。'.reference(.weak)'会弱引用此缓动,Ubergang不会增加引用计数。保持缓动活跃是你的责任。
开始一个重复5次带有yo-yo效果的数字缓动
var tween: NumericTween<Int>?
func run() {
tween = 0.tween(to: 10)
.id("intTween")
.duration(5)
.update({ value in print("update: \(value)") })
.ease(.elastic(.out))
.reference(.weak)
.options(.repeat(5), .yoyo)
.start()
}
开始一个弱数字缓动(CGAffineTransform)
@IBOutlet var testView: UIView!
var tween: TransformTween?
func run() {
//declare the target values
var to = testView.transform
to.ty = 200.0
tween = testView.transform.tween(to: transform)
.id("testView")
.duration(2.5)
.reference(.weak)
.update({ [unowned self] value in self.testView.transform = value })
.start()
}
此id为'testView'的缓动在2.5秒内进行变换。每次更新将把得到的变换赋值给testView,即'welf.testView.transform = value'。
开始包含三个缓动的时间轴
var timeline: UTimeline = UTimeline(id: "timeline")
func run() {
timeline.options(.yoyo).reference(.weak)
timeline.append(
0.tween(to: 10).id("intTween").duration(5).update({ value, _ in print("0-10 value: \(value)") })
)
timeline.append(
0.0.tween(to: 10.0).id("floatTween1").duration(5).update({ value, _ in print("0.0-10.0 value: \(value)") })
)
timeline.insert(
10.0.tween(to: 0.0).id("floatTween2").duration(5).update({ value, _ in print("10.0-0.0 value: \(value)") }), at: 2.5
)
timeline.start()
}
此时间轴控制系统中的一个缓动从0.0秒开始,一个缓动从5.0秒开始,另一个缓动从2.5秒开始。所有缓动由给定选项的时间轴控制,本例中的缓动选项为
.yoyo
。
沿着UIBezierPath缓动
var tween: BezierPathTween!
func run() {
tween = BezierPathTween().along(path)
.id("bezierTween")
.duration(5)
.ease(.linear)
.reference(.weak)
.update({ [unowned self] (value: CGPoint, progress: Double) in
//update
})
.start()
}
通过点进行缓动
var tween: BezierPathTween!
func run() {
let points = [CGPoint]()
points.append(...)
tween = BezierPathTween().along(points)
.id("bezierTween")
.duration(5)
.ease(.linear)
.reference(.weak)
.update({ [unowned self] (value: CGPoint, progress: Double) in
//update
})
.start()
}
通过点进行缓动且使用方向调整对象更新时的对齐
var tween: BezierPathTween!
func run() {
let points = [CGPoint]()
points.append(...)
tween = BezierPathTween().along(points)
.id("bezierTween")
.duration(5)
.ease(.linear)
.reference(.weak)
.update({ [unowned self] (value:CGPoint, progress: Double, orientation: CGPoint) in
self.targetView.center = value
let angle = atan2(orientation.y, orientation.x)
let transform = CGAffineTransformRotate(CGAffineTransformIdentity, angle)
self.targetView.transform = transform
})
.start()
}
更新日志 1.2.0 版本
- 缓动类型已从直接传递函数类型更改为枚举类型,例如:
.ease(Linear.ease) becomes .ease(.linear)
.ease(Elastic.easeOut) becomes .ease(.elastic(.out))
- 当开始一个正在进行中的缓动时,现在将通过日志代理仅记录警告,而不是保护重启
- 新缓动方向 'backward' 将在时间轴内反转缓动和缓动开始时间
/*
forward -->
t0: |-----------------------|
t1: |----------------------|
t2: |--------|
*/
/*
<-- reverse
t0: |-----------------------|
t1: |----------------------|
t2: |--------|
*/
/*
<-- backward
t0: |-----------------------|
t1: |----------------------|
t2: |--------|
*/
更新日志 1.1.0 版本
- Swift 5 迁移
更新日志 1.0 版本
- Swift 4 迁移
- 更改缓动创建模式(移除 UTweenBuilder - 直接实例化缓动对象或使用适当的扩展,例如
0.tween(to: 10)
) - 添加 @discardableResult 到特定方法
- 修复了时间轴在缓动之间有延迟时无法工作的问题
我们始终欢迎反馈