Fastis 是一个完全可定制的 UI 组件,用于选择日期和范围,它基于 JTAppleCalendar 库构建。
CocoaPods 是 Cocoa 项目的依赖管理工具。您可以使用以下命令安装它
$ gem install cocoapods
要使用 CocoaPods 将 Fastis 集成到您的 Xcode 项目中,请在您的 Podfile
中指定它
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '13.0'
use_frameworks!
target '<Your Target Name>' do
pod 'Fastis', '~> 2.0'
end
然后,运行以下命令
$ pod install
Swift Package Manager 是一种用于自动分发 Swift 代码的工具,它已集成到 swift
编译器中。
设置好 Swift 包后,将 Fastis 添加为依赖项就像将其添加到 Package.swift
的 dependencies
值中一样简单。
dependencies: [
.package(url: "https://github.com/simla-tech/Fastis.git", .upToNextMajor(from: "2.0.0"))
]
不支持 Carthage。
如果您不想使用上述任何依赖管理工具,您可以手动将 Fastis 集成到您的项目中。
import Fastis
class MyViewController: UIViewController {
func chooseDate() {
let fastisController = FastisController(mode: .range)
fastisController.title = "Choose range"
fastisController.maximumDate = Date()
fastisController.allowToChooseNilDate = true
fastisController.shortcuts = [.today, .lastWeek]
fastisController.dismissHandler = { [weak self] action in
switch action {
case .done(let newValue):
...
case .cancel:
...
}
}
fastisController.present(above: self)
}
}
如果您想获取单个日期,则必须使用 Date
类型
let fastisController = FastisController(mode: .single)
fastisController.initialValue = Date()
fastisController.dismissHandler = { [weak self] action in
switch action {
case .done(let resultDate):
print(resultDate) // resultDate is Date
case .cancel:
...
}
}
如果您想获取日期范围,则必须使用 FastisRange
类型
let fastisController = FastisController(mode: .range)
fastisController.initialValue = FastisRange(from: Date(), to: Date()) // or .from(Date(), to: Date())
fastisController.dismissHandler = { [weak self] action in
switch action {
case .done(let resultRange):
print(resultRange) // resultRange is FastisRange
case .cancel:
...
}
}
FastisController 具有以下默认配置参数
var shortcuts: [FastisShortcut<Value>] = []
var allowsToChooseNilDate: Bool = false
var dismissHandler: ((DismissAction) -> Void)? = nil
var initialValue: Value? = nil
var minimumDate: Date? = nil
var maximumDate: Date? = nil
var selectMonthOnHeaderTap: Bool = true
var allowDateRangeChanges: Bool = true
var closeOnSelectionImmediately: Bool = false
shortcuts
- 快捷方式数组。默认值为 []
。请参见 快捷方式 部分allowsToChooseNilDate
- 允许选择 nil
日期。如果设置为 true
,则“完成”按钮将始终处于启用状态,并且您可以通过再次点击所选日期来重置选择。默认值为 false
。dismissHandler
- 视图关闭后要执行的闭包。默认值为 nil
。在点击“完成”按钮后返回 DismissAction.done(FastisValue?),或者在不点击“完成”按钮关闭控制器时返回 DismissAction.cancel。initialValue
- 默认情况下将选择的初始值。默认值为 nil
。minimumDate
- 最小选择日期。小于当前日期的日期将被标记为不可用。默认值为 nil
。maximumDate
- 最大选择日期。大于当前日期的日期将被标记为不可用。默认值为 nil
。selectMonthOnHeaderTap
(仅适用于 .range
模式) - 如果您希望允许通过点击月份来选择日期范围,请将此变量设置为 true
。默认值为 true
。allowDateRangeChanges
(仅适用于 .range
模式) - 如果您想禁用日期范围更改,请将此变量设置为 false
。选择范围后的下一次点击将开始新的范围选择。默认值为 true
。closeOnSelectionImmediately
(仅适用于 .single
模式) - 如果您希望隐藏所选日期的视图并在选择日期后立即关闭控制器,请将此变量设置为 true
。默认值为 false
使用快捷方式可以快速选择设置的日期或日期范围。默认情况下 .shortcuts
为空。如果您不提供任何快捷方式,底部容器将被隐藏。
在 Fastis 中,为每种模式提供了一些预定义的快捷方式
.single
: .today
, .tomorrow
, .yesterday
.range
: .today
, .lastWeek
, .lastMonth
此外,您可以创建自己的快捷方式
var customShortcut = FastisShortcut(name: "Today") {
let now = Date()
return FastisRange(from: now.startOfDay(), to: now.endOfDay())
}
fastisController.shortcuts = [customShortcut, .lastWeek]
Fastis 可以进行全局或本地自定义。FastisConfig
包含多个部分
calendar
- 用于渲染 UI 的基本日历。默认值为 .current
。controller
- 基本视图控制器(cancelButtonTitle
、doneButtonTitle
等)monthHeader
- 月份标题dayCell
- 天单元格(选择参数、字体等)todayCell
- 今天单元格(选择参数、字体、圆形视图等)。如果将 todayCell
设置为 nil
,则视图将改为使用 dayCell
weekView
- 带有工作日名称的顶部标题视图currentValueView
- 当前值视图外观(清除按钮、日期格式等)shortcutContainerView
- 带有快捷方式的底部视图shortcutItemView
- 底部视图中的快捷方式项要自定义应用程序中的所有 Fastis 控制器,请使用 FastisConfig.default
FastisConfig.default.monthHeader.labelColor = .red
要自定义特殊的 FastisController 实例
var customConfig = FastisConfig.default
customConfig.controller.dayCell.dateLabelColor = .blue
let fastisController = FastisController(mode: .range, config: customConfig)
要使用自定义日历自定义特殊的 FastisController 实例
var customConfig: FastisConfig = .default
var calendar = Calendar(identifier: .islamicUmmAlQura)
calendar.locale = .autoupdatingCurrent
customConfig.calendar = calendar
let fastisController = FastisController(mode: .range, config: customConfig)
fastisController.minimumDate = calendar.date(byAdding: .month, value: -2, to: Date())
fastisController.maximumDate = calendar.date(byAdding: .month, value: 3, to: Date())
要自定义今天的单元格
let config = FastisConfig.withCurrentDate
config.todayCell.dateLabelColor = .red
config.todayCell.onRangeLabelColor = .red
config.todayCell.circleSize = 4
config.todayCell.circleViewColor = .red
如果您不想自定义今天的日期单元格,只需设置 config.todayCell = nil
,今天的单元格将使用 dayCell
配置。
该库还包含一个 SwiftUI 包装器
如果您想获取日期范围
FastisView(mode: .single, dismissHandler: { action in
switch action {
case .done(let resultDate):
print(resultDate) // resultDate is Date
case .cancel:
...
}
})
.title("Choose range")
.initialValue(self.currentValue as? FastisRange)
.minimumDate(Calendar.current.date(byAdding: .month, value: -2, to: Date()))
.maximumDate(Calendar.current.date(byAdding: .month, value: 3, to: Date()))
.allowToChooseNilDate(true)
.allowDateRangeChanges(false)
.shortcuts([.lastWeek, .lastMonth])
.selectMonthOnHeaderTap(true)
如果您想获取单个日期
FastisView(mode: .range, dismissHandler: { action in
switch action {
case .done(let resultRange):
print(resultRange) // resultRange is FastisRange
case .cancel:
...
}
})
.title("Choose date")
.initialValue(self.currentValue as? Date)
.minimumDate(Calendar.current.date(byAdding: .month, value: -2, to: Date()))
.maximumDate(Date())
.allowToChooseNilDate(true)
.allowDateRangeChanges(false)
.shortcuts([.yesterday, .today, .tomorrow])
.closeOnSelectionImmediately(true)
文档参考
您可以使用 详细的 DocC 文档,其中包含有关所有组件的参考文档。
Fastis 在 MIT 许可证下发布。有关详细信息,请参见 LICENSE。