Skip to content

Latest commit

 

History

History
153 lines (123 loc) · 4.65 KB

README.md

File metadata and controls

153 lines (123 loc) · 4.65 KB

RSRangedDateTimePicker

RSRangedDateTimePicker is a versatile SwiftUI and UIKit compatible library for displaying customizable date and time pickers with range selection support.

date style = .date time style = .time
dateRange style = .dateRange timeRange style = .timeRange

Features

  • 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

Requirements

  • iOS 16.0+
  • Swift 5.10+

Installation

Swift Package Manager

Add the following line to your Package.swift file:

.package(url: "https://github.com/RanduSoft/RSRangedDateTimePicker.git", from: "1.0.0")

Usage

Check out the DemoView.swift file or the examples below:

SwiftUI

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)
        }
    }
}

UIKit

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

Customization

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.

License

RSRangedDateTimePicker is available under the MPL-2.0 license. See the LICENSE file for more info.