A customizable SwiftUI date range picker that extends beyond the capabilities of Apple's built-in DatePicker. It provides a calendar-style interface for selecting both single dates and date ranges with various constraints.
- Calendar-style date picker with month grid display
- Support for both single date and date range selection modes
- Support for date constraints with various range types:
ClosedRange<Date>(start...end)PartialRangeFrom<Date>(start...)
- Automatic date normalization (removes time components)
- Year selection view for quick navigation
- Month-to-month navigation
- Today indicator
- Customizable accent color
- Customizable corner radius for date cells
- Disabled appearance for dates outside allowed range
Add the following to your Package.swift file:
dependencies: [
.package(url: "https://github.com/yourusername/DateRangePicker.git", from: "1.0.0")
]Or add it directly in Xcode:
- Go to File > Add Packages...
- Enter the repository URL
- Click Add Package
@State private var singleDate: Date? = nil
var body: some View {
DateRangePicker(
mode: .single,
startDate: $singleDate,
endDate: .constant(nil)
)
}@State private var startDate: Date? = nil
@State private var endDate: Date? = nil
var body: some View {
DateRangePicker(
mode: .range,
startDate: $startDate,
endDate: $endDate
)
}@State private var startDate: Date? = nil
@State private var endDate: Date? = nil
var body: some View {
let today = Calendar.current.startOfDay(for: Date())
DateRangePicker(
mode: .range,
startDate: $startDate,
endDate: $endDate,
allowedDateRange: today...
)
}@State private var startDate: Date? = nil
@State private var endDate: Date? = nil
var body: some View {
let today = Calendar.current.startOfDay(for: Date())
let thirtyDaysFromNow = Calendar.current.date(byAdding: .day, value: 30, to: today)!
DateRangePicker(
mode: .range,
startDate: $startDate,
endDate: $endDate,
allowedDateRange: today...thirtyDaysFromNow
)
}DateRangePicker(
color: .purple,
mode: .range,
startDate: $startDate,
endDate: $endDate
)// Square corners (0 radius)
DateRangePicker(
cornerRadius: 0,
mode: .range,
startDate: $startDate,
endDate: $endDate
)
// Default corners (8 radius)
DateRangePicker(
cornerRadius: 8,
mode: .range,
startDate: $startDate,
endDate: $endDate
)
// Very rounded corners (20 radius)
DateRangePicker(
cornerRadius: 20,
mode: .range,
startDate: $startDate,
endDate: $endDate
)public init(
color: Color = .primary,
cornerRadius: CGFloat = 8,
mode: SelectionMode = .single,
startDate: Binding<Date?>,
endDate: Binding<Date?>,
allowedDateRange: (any RangeExpression<Date>)? = nil,
normalizeToMidnight: Bool = true
)color: The accent color for the picker (default:.primary)cornerRadius: The corner radius for date selection cells (default:8)mode: Selection mode -.singleor.range(default:.single)startDate: Binding to the selected start dateendDate: Binding to the selected end dateallowedDateRange: Optional range of dates that are selectablenormalizeToMidnight: Whether to normalize dates to midnight (removes time components) (default:true)
Check out the included example app to see all the features in action.
[Your License]