MKTween 4.1

MKTween 4.1

测试已测试
语言语言 SwiftSwift
许可证 MIT
发布最后发布2019年4月
SPM支持 SPM

Kevin Malkic 维护。



  • 作者
  • Kevin Malkic

MKTween

Swift 5.0 中非常简单和轻量级的缓动框架。无对象/视图绑定以实现更灵活的使用。使用 CADisplayLink 或 NSTimer 与时间间隔参数。

从 4.0 版本开始,您现在可以使用组和序列来链式动画。如果您使用的是 3.2 及以下版本,您必须更新您的代码以使用 4.0 及以上版本!

如果您有任何建议或评论,请分享。谢谢

要求

  • iOS 11.0+
  • Xcode 10.2+

用法

缓动时间函数

Timing.linear
Timing.backOut
Timing.backIn
Timing.backInOut
Timing.bounceOut
Timing.bounceIn
Timing.bounceInOut
Timing.circleOut
Timing.circleIn
Timing.circleInOut
Timing.cubicOut
Timing.cubicIn
Timing.cubicInOut
Timing.elasticOut
Timing.elasticIn
Timing.elasticInOut
Timing.expoOut
Timing.expoIn
Timing.expoInOut
Timing.quadOut
Timing.quadIn
Timing.quadInOut
Timing.quartOut
Timing.quartIn
Timing.quartInOut
Timing.quintOut
Timing.quintIn
Timing.quintInOut
Timing.sineOut
Timing.sineIn
Timing.sineInOut
Timing.custom()

单个缓动

let period = Period<CGFloat>(start: 0, end: 1).set(update: { (period) in
    print(period.progress)
}) {
    print("complete")
}.set(timingMode: .elasticInOut)
Tween.shared.add(period: period)

现在支持CGPoint、CGSize、CGRect和UIColor。

let period = Period<CGRect>(start: .zero, end: CGRect(x: 10, y: 10, width: 100, height: 200), duration: 2).set(update: { (period) in
    print(period.progress)
}) {
    print("complete")
}.set(timingMode: .elasticInOut)
Tween.shared.add(period: period)

组缓动

let periods: [BasePeriod] = [
    Period<CGFloat>(start: 0, end: 200, duration: 1).set(update: { [weak self] period in
        if let circleView = self?.circleView {
            var origin = circleView.center
            origin.x = 20 + (period.progress)
            circleView.center = origin
        }
    }).set(timingMode: .linear),
    Period<CGFloat>(start: 0, end: 200, duration: 1).set(update: { [weak self] period in
        if let circleView = self?.circleView {
            var origin = circleView.center
            origin.y = 160 + (period.progress)
            circleView.center = origin
        }
    }).set(timingMode: .quadInOut)
]
let group = Group(periods: periods)
    .set(update: { group in
        print("\(group.periodFinished.filter { $0 }.count) finished on \(group.periodFinished.count)")
    }) {
        print("complete")
}
Tween.shared.add(period: group)

序列缓动

let periods: [BasePeriod] = [
    Period<CGFloat>(start: 0, end: 200, duration: 1).set(update: { [weak self] period in
        if let circleView = self?.circleView {
            var origin = circleView.center
            origin.x = 20 + (period.progress)
            circleView.center = origin
        }
    }).set(timingMode: .linear),
    Period<CGFloat>(start: 0, end: 200, duration: 1).set(update: { [weak self] period in
        if let circleView = self?.circleView {
            var origin = circleView.center
            origin.y = 160 + (period.progress)
            circleView.center = origin
        }
    }).set(timingMode: .quadInOut)
]
let sequence = MKTween.Sequence(periods: periods)
    .set(update: { sequence in
        print("\(sequence.currentPeriodIndex) finished on \(sequence.periods.count)")
    }) {
        print("complete")
}
Tween.shared.add(period: sequence)

您也可以根据需求组合组和序列。

缓动实例

我经常看到使用缓动的独特方式,使其只能以单种方式初始化,从而无法使用多个实例。所以您可以确保不会忘记设置变量。以下是您可以分配的方式:

let tween = Tween.shared
let tween = Tween.shared()
let tween = Tween.shared(.default) // Use CADisplayLink 
let tween = Tween.shared(.displayLink) // Use CADisplayLink 
let tween = Tween.shared(.timer) // Use NSTimer 
let tween = Tween.shared(.none) // If you don't want any tick system to use your own, calling update(timeStamp:) yourself

let tween = Tween()
let tween = Tween(.default)
let tween = Tween(.displayLink)
let tween = Tween(.timer)
let tween = Tween(.none)

技巧

设置时间间隔

public var frameInterval: Int = 1 // Used for CADisplayLink. Defines how many display frames must pass between each time the display link fires. Can check apple documentation.
public var timerInterval: NSTimeInterval = 1.0/60.0 // Base on a 60 fps rate by default.

**直接获取缓动值,无需使用tick**

let period = Period<CGFloat>(duration:1).set(timingMode: .backInOut) // will default to startValue 0 and endValue to 1
let tweenValues = period.tweenValues(UInt(count))

tweenValues.enumerated().forEach { index, progress in
    
    // do something with it
}

暂停

tween.paused = true

在缓动运行时反转缓动

period.reverse() // This will basically exchange startValue and endValue, but will use the same time already progressed to animated the other side.

安装

内嵌框架需要至少iOS 11的部署目标。

CocoaPods

CocoaPods 是一个用于 Cocoa 项目的依赖管理器。你可以使用以下命令进行安装

$ gem install cocoapods

需要使用ЦocoaPods 1.6.1+ 来构建 MKTween 4.0+。

要使用 CocoaPods 将 MKTween 集成到你的 Xcode 项目中,请在你项目的 Podfile 中指定它

最后完成!

source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '11.0'
use_frameworks!

pod 'MKTween', '~> 4.1'

接下来,运行以下命令

$ pod install

嵌入式框架

  • 打开终端,使用 cd 进入顶级项目目录,如果项目不是作为 git 仓库初始化,请运行以下命令
$ git init
  • 通过运行以下命令将 MKTween 添加为 git 子模块
$ git submodule add https://github.com/kmalkic/MKTween.git
  • 打开新的 MKTween 文件夹,并将 MKTween.xcodeproj 拖到应用程序 Xcode 项目的项目导航器中。

    它应该出现在你的应用程序蓝色项目图标之下。它是在所有其他 Xcode 组之上还是之下并不重要。

  • 在项目导航器中选择 MKTween.xcodeproj,确保部署目标与你的应用程序目标相匹配。

  • 接下来,在项目导航器中选择你的应用程序项目(蓝色项目图标),导航到目标配置窗口,在侧边栏的“Targets”标题下选择应用程序目标。

  • 在该窗口的选项卡栏中,打开“General”面板。

  • 在“Embedded Binaries”部分下点击 + 按钮。

  • 你会看到两个不同的 MKTween.xcodeproj 文件夹,每个文件夹中都有一个不同版本的 MKTween.framework 嵌套在 Products 文件夹中。

    选择哪个 Products 文件夹并不重要,但是选择顶部还是底部的 MKTween.framework 很重要。

  • 到此结束!

MKTween.framework 自动添加为目标依赖项、链接框架和嵌入框架,在你的源文件构建阶段,这是在模拟器和设备上构建所需的全部内容。


感谢

Kevin Malkic

许可协议

MKTween 采用 MIT 许可协议发布。详细信息请参阅 LICENSE。