Fastis

SwiftMP compatible CocoaPods compatible Swift Xcode License

Fastis 是一个完全可定制的 UI 组件,用于选择日期和范围,它基于 JTAppleCalendar 库构建。

要求

特性

Android 实现

安装

CocoaPods

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 Package Manager 是一种用于自动分发 Swift 代码的工具,它已集成到 swift 编译器中。

设置好 Swift 包后,将 Fastis 添加为依赖项就像将其添加到 Package.swiftdependencies 值中一样简单。

dependencies: [
    .package(url: "https://github.com/simla-tech/Fastis.git", .upToNextMajor(from: "2.0.0"))
]

Carthage

不支持 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 为空。如果您不提供任何快捷方式,底部容器将被隐藏。

在 Fastis 中,为每种模式提供了一些预定义的快捷方式

此外,您可以创建自己的快捷方式

var customShortcut = FastisShortcut(name: "Today") {
    let now = Date()
    return FastisRange(from: now.startOfDay(), to: now.endOfDay())
}
fastisController.shortcuts = [customShortcut, .lastWeek]

文档参考

自定义

Fastis 可以进行全局或本地自定义。FastisConfig 包含多个部分

要自定义应用程序中的所有 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

该库还包含一个 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 文档,其中包含有关所有组件的参考文档。

-> 转到 DocC 文档

贡献者

许可证

Fastis 在 MIT 许可证下发布。有关详细信息,请参见 LICENSE。