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。