Fastis is a fully customizable UI component for picking dates and ranges created using JTAppleCalendar library.
- iOS 13.0+
- Xcode 11.0+
- Swift 5.0+
- Flexible customization
- Shortcuts for dates and ranges
- Single date and date range modes
CocoaPods is a dependency manager for Cocoa projects. You can install it with the following command:
$ gem install cocoapods
To integrate Fastis into your Xcode project using CocoaPods, specify it in your Podfile
:
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '13.0'
use_frameworks!
target '<Your Target Name>' do
pod 'Fastis', '~> 1.0.0'
end
Then, run the following command:
$ pod install
The Swift Package Manager is a tool for automating the distribution of Swift code and is integrated into the swift
compiler.
Once you have your Swift package set up, adding Fastis as a dependency is as easy as adding it to the dependencies
value of your Package.swift
.
dependencies: [
.package(url: "https://github.com/simla-tech/Fastis.git", .upToNextMajor(from: "1.0.0"))
]
If you prefer not to use either of the aforementioned dependency managers, you can integrate Fastis into your project manually.
import Fastis
class MyViewController: UIViewController {
func chooseDate() {
let fastisController = FastisController(mode: .range)
fastisController.title = "Choose range"
fastisController.maximumDate = Date()
fastisController.allowsToChooseNilDate = true
fastisController.shortcuts = [.today, .lastWeek]
fastisController.doneHandler = { resultRange in
...
}
fastisController.present(above: self)
}
}
If you want to get a single date you have to use Date
type:
let fastisController = FastisController(mode: .single)
fastisController.initialValue = Date()
fastisController.doneHandler = { resultDate in
print(resultDate) // resultDate is Date
}
If you want to get a date range you have to use FastisRange
type:
let fastisController = FastisController(mode: .range)
fastisController.initialValue = FastisRange(from: Date(), to: Date()) // or .from(Date(), to: Date())
fastisController.doneHandler = { resultRange in
print(resultRange) // resultDate is FastisRange
}
FastisController have the following default configuration parameters:
var shortcuts: [FastisShortcut<Value>] = []
var allowsToChooseNilDate: Bool = false
var dismissHandler: (() -> Void)? = nil
var doneHandler: ((Value?) -> Void)? = nil
var initialValue: Value? = nil
var minimumDate: Date? = nil
var maximumDate: Date? = nil
var selectMonthOnHeaderTap: Bool = true
var allowDateRangeChanges: Bool = true
shortcuts
- Shortcuts array. Default value is[]
. See Shortcuts sectionallowsToChooseNilDate
- Allow to choosenil
date. If you settrue
done button will be wlways enabled. Default value isfalse
.dismissHandler
- The block to execute after the dismissal finishes. Default value isnil
.doneHandler
- The block to execute after "Done" button will be tapped. Default value isnil
.initialValue
- And initial value which will be selected bu default. Default value isnil
.minimumDate
- Minimal selection date. Dates less then current will be markes as unavailable. Default value isnil
.maximumDate
- Maximum selection date. Dates greather then current will be markes as unavailable. Default value isnil
.selectMonthOnHeaderTap
(Only for.range
mode) - Set this variable totrue
if you want to allow select date ranges by tapping on months. Default value istrue
.allowDateRangeChanges
(Only for.range
mode) - Set this variable tofalse
if you want to if you want to disable date range changes. Next tap after selecting range will start new range selection. Default value istrue
.
Using shortcuts allows you to quick select prepared dates or date ranges.
By default .shortcuts
is empty. If you don't provide any shortcuts the bottom container will be hidden.
In Fasis available some prepared shortcuts for each mode:
- For
.single
:.today
,.tomorrow
,.yesterday
- For
.range
:.today
,.lastWeek
,.lastMonth
Also you can create your own shortcut:
var customShortcut = FastisShortcut(name: "Today") {
let now = Date()
return FastisRange(from: now.startOfDay(), to: now.endOfDay())
}
fastisController.shortcuts = [customShortcut, .lastWeek]
Fastis can be customized global or local. FastisConfig
have some sections:
controller
- base view controller (cancelButtonTitle
,doneButtonTitle
, etc.)monthHeader
- month titlesdayCell
- day cells (selection parameters, font, etc.)weekView
- top header view with week day namescurrentValueView
- current value view appereance (clear button, date format, etc.)shortcutContainerView
- bottom view with shortcutsshortcutItemView
- shortcut item in the bottom view
To cutomize all Fastis controllers in your app use FastisConfig.default
:
FastisConfig.default.monthHeader.labelColor = .red
To customize special FastisController instance:
var customConfig = FastisConfig.default
customConfig.controller.dayCell.dateLabelColor = .blue
let fastisController = FastisController(mode: .range, config: customConfig)
- Ilya Kharlamov (@ilia3546)
Fastis is released under the MIT license. See LICENSE for details.