You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

141 lines
3.7 KiB

import SwiftUI
// MARK: -
struct DatePickerView: View {
let title: String
let isRequired: Bool
let date: Binding<Date>
let displayedComponents: DatePickerComponents
let icon: String?
init(
title: String,
isRequired: Bool = false,
date: Binding<Date>,
displayedComponents: DatePickerComponents = [.date, .hourAndMinute],
icon: String? = nil
) {
self.title = title
self.isRequired = isRequired
self.date = date
self.displayedComponents = displayedComponents
self.icon = icon
}
var body: some View {
VStack(alignment: .leading, spacing: 8) {
InputTitleView.required(title, icon: icon)
DatePicker(title, selection: date, displayedComponents: displayedComponents)
.datePickerStyle(CompactDatePickerStyle())
.labelsHidden()
.padding(.horizontal, 12)
.padding(.vertical, 8)
.background(
RoundedRectangle(cornerRadius: 8)
.fill(Color(.systemGray6))
)
}
}
}
// MARK: -
extension DatePickerView {
static func dateOnly(
title: String,
isRequired: Bool = false,
date: Binding<Date>,
icon: String? = nil
) -> DatePickerView {
DatePickerView(
title: title,
isRequired: isRequired,
date: date,
displayedComponents: .date,
icon: icon
)
}
static func timeOnly(
title: String,
isRequired: Bool = false,
date: Binding<Date>,
icon: String? = nil
) -> DatePickerView {
DatePickerView(
title: title,
isRequired: isRequired,
date: date,
displayedComponents: .hourAndMinute,
icon: icon
)
}
static func dateAndTime(
title: String,
isRequired: Bool = false,
date: Binding<Date>,
icon: String? = nil
) -> DatePickerView {
DatePickerView(
title: title,
isRequired: isRequired,
date: date,
displayedComponents: [.date, .hourAndMinute],
icon: icon
)
}
static func startDate(
title: String = "开始时间",
isRequired: Bool = true,
date: Binding<Date>,
icon: String? = "calendar"
) -> DatePickerView {
DatePickerView(
title: title,
isRequired: isRequired,
date: date,
displayedComponents: [.date, .hourAndMinute],
icon: icon
)
}
static func endDate(
title: String = "结束时间",
isRequired: Bool = true,
date: Binding<Date>,
icon: String? = "calendar"
) -> DatePickerView {
DatePickerView(
title: title,
isRequired: isRequired,
date: date,
displayedComponents: [.date, .hourAndMinute],
icon: icon
)
}
}
#Preview {
VStack(spacing: 16) {
DatePickerView.dateOnly(
title: "选择日期",
date: .constant(Date())
)
DatePickerView.timeOnly(
title: "选择时间",
date: .constant(Date())
)
DatePickerView.dateAndTime(
title: "选择日期和时间",
date: .constant(Date())
)
DatePickerView.startDate(date: .constant(Date()))
DatePickerView.endDate(date: .constant(Date().addingTimeInterval(3600)))
}
.padding()
}