RSRangedDateTimePicker is a versatile SwiftUI and UIKit compatible library for displaying customizable date and time pickers with range selection support.
style = .date |
style = .time |
style = .dateRange |
style = .timeRange |
- SwiftUI and UIKit compatible
- Single date/time or range selection
- Customizable date and time formats
- Configurable minimum and maximum dates
- Adjustable time intervals
- Supports both modal presentation and in-view embedding
- iOS 16.0+
- Swift 5.10+
Add the following line to your Package.swift
file:
.package(url: "https://github.com/RanduSoft/RSRangedDateTimePicker.git", from: "1.0.0")
Check out the DemoView.swift
file or the examples below:
import SwiftUI
import RSRangedDateTimePicker
struct ContentView: View {
@State private var showPicker = false
@State private var selectedRange = PickerView.DateRange(start: Date(), end: Date())
var body: some View {
VStack {
Button("Show Date Range Picker") {
showPicker = true
}
List {
HStack {
Text("Start")
Spacer()
Text(selectedRange.start, style: .date)
.foregroundStyle(.secondary)
}
HStack {
Text("End")
Spacer()
Text(selectedRange.end, style: .date)
.foregroundStyle(.secondary)
}
}
}
.sheet(isPresented: $showPicker) {
RSRangedDateTimePickerView(style: .dateRange(), selectedRange: $selectedRange)
}
}
}
import UIKit
import RSRangedDateTimePicker
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let button = UIButton(type: .system)
button.setTitle("Show Picker", for: .normal)
button.addTarget(self, action: #selector(showPicker), for: .touchUpInside)
view.addSubview(button)
button.center = view.center
}
@objc func showPicker() {
RSRangedDateTimePickerViewController.show(
on: self,
style: .dateRange(),
onRangeSelected: { range in
print("Selected range: \(range.start) - \(range.end)")
}
)
}
@objc func showPickerAlt() {
let datePickerVC = RSRangedDateTimePickerViewController(style: .date())
datePickerVC.onDateSelected = { newDate in
print(newDate)
}
datePickerVC.onRangeSelected = { dateRange in
print(dateRange.start, dateRange.end)
}
datePickerVC.onDismiss = {
print("onDismiss")
}
datePickerVC.modalPresentationStyle = .overCurrentContext
self.presentController(datePickerVC, animated: false)
}
}
Note
Each style
will only use its initial
(optional) variable. Make sure to use
initialDate
for style = .date / .time
or
initialRange
for style = .dateRange / .timeRange
You can customize the picker's appearance and behavior by adjusting the Style
and Config
parameters:
let customConfig = PickerView.Config(
minimumDate: Date(),
maximumDate: Date().addingTimeInterval(86400 * 30),
minutesInterval: 30,
minimumMultipleOfMinutesIntervalForRangeDuration: 2,
calendar: Calendar.current
)
let customStyle = PickerView.Style.dateRange(formatter: {
let formatter = DateFormatter()
formatter.dateFormat = "MMM d, yyyy"
return formatter
}())
Use these customStyle
and customConfig
in both SwiftUI
and UIKit
.
The "Save" button foreground color is the app tint color and cannot be changed at this time.
RSRangedDateTimePicker is available under the MPL-2.0 license. See the LICENSE file for more info.