Ubergang 1.2.0

Ubergang 1.2.0

测试已测试
语言语言 SwiftSwift
许可证 Apache-2.0
发布最后发布2019年7月
SPM支持 SPM

Robin Frielingsdorf维护。



Ubergang 1.2.0

  • 作者:
  • Robin Frielingsdorf

Ubergang - a tweening engine for iOS

Platform iOS CocoaPods Compatible License Apache2 iOS

Ubergang 是一个用 Swift 编写的 iOS 插值引擎。

特性

  • 插值数字值、UIColors 和 CGAffineTransforms
  • 沿着 UIBezierPaths 插值
  • 通过点进行插值
  • 线性、指数、立方、二次、圆形、四次方、五次方、正弦、回弹、弹跳和弹性缓动
  • 通用插值设置
  • 重复和Yoyo插值选项
  • 为强和弱插值对象引用提供内存管理
  • 插值时间线
  • Bezier 插值对齐路径
  • 日志记录和日志级别

预览

Example - Timeline Example - Timeline

安装

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 到特定方法
  • 修复了时间轴在缓动之间有延迟时无法工作的问题

我们始终欢迎反馈