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