CalendarView 是 UICalendarView 的一个 SwiftUI 封装。UICalendarView 是一个显示日历的视图,允许用户选择单个或多个日期。它还允许显示特定日期的装饰。
有关其完整功能的更多信息,请参阅 Apple 的 UICalendarView 文档。
使用 CalendarView 所需的最低要求是将其附加到具有 DateComponents 类型的 Binding 变量。 如果您希望将日期选择限制为一次一个日期,请使用可选的 DateComponents。 要允许多个日期选择,Binding 应该是一个 Set<DateComponents>(DateComponents 的 Set)。
提示
如果您不需要跟踪任何选择,您也可以完全省略此参数。
另外,如果使用多项选择并且选择的顺序很重要,您可以使用 [DateComponents] 而不是 Set。
struct ContentView: View {
@State
private var singleDateSelection: DateComponents? = nil
@State
private var multipleDateSelection: Set<DateComponents> = []
var body: some View {
VStack {
// No selection tracking
CalendarView()
// Single date selection tracking
CalendarView($singleDateSelection)
// Multiple date selection tracking
CalendarView($multipleDateSelection)
}
}
}
警告
在 CalendarView 外部更新 selection Binding 时,请务必小心。
如果您手动创建或更改从 CalendarView 输出的 DateComponents 实例,并且其中的组件与视图内部设置的组件不完全相同,您可能会遇到意外行为,例如重复选择等。
建议将 Binding 用作“只读”属性,而不是直接写入它。
CalendarView 的一些元素可以使用 SwiftUI 的 Environment 及其标准的 ViewModifier (environment(_:_:)) 来设置。
这也意味着如果这些设置在父 Environment 中设置,CalendarView 也会对这些设置做出反应。 为了方便起见,该软件包还提供了缩写的修饰符来直接设置这些值。
这些元素是
calendar/Calendar)locale/Locale)timeZone/TimeZone)DateComponent 值将预先设置应用的 TimeZone(或活动 Environment 中的时区)。CalendarView($selectedDate)
// Environment Modifier
// Calendar
.environment(\.calendar, Calendar(identifier: .chinese))
// Locale
.environment(\.locale, Locale(identifier: "en_GB"))
// Time Zone
.environment(\.timeZone, TimeZone(identifier: "America/Chicago")!)
// Convenience Modifiers
// Calendar
.calendar(Calendar(identifier: .chinese))
// Locale
.locale(Locale(identifier: "en_GB"))
// Time Zone
.timeZone(TimeZone(identifier: "America/Chicago")!)
UICalendarView (因此,也间接通过 CalendarView) 的另一个功能是显示与日历中的任何日期相关的“装饰”。 这些装饰可以因日历中的不同日期而异,所有日期使用一种类型的装饰,或者根本不使用任何装饰。
不同的装饰类型如下
default(color: Color? = nil, size: DecorationSize = .medium)
image(_ systemName: String, color: Color? = nil, size: DecorationSize = .medium)
UIImage 或 SF Symbols 图标的名称来指定图像。circlebadge.fill 符号。systemFill。custom(@ViewBuilder _ customViewProvider: () -> some View)
@ViewBuilder 闭包,使用自定义 SwiftUI 视图的自定义装饰。提示
您可以使用多个装饰修饰符为不同的日期(或未在其他修饰符中明确指定的所有日期)指定不同的装饰。
为特定日期明确指定的装饰优先于为未指定特定日期指定的装饰。
CalendarView($selectedDate)
// This sets an orange `star.fill` symbol under all dates in the calendar.
.decorations(.image("star.fill", color: .orange))
// This displays the month number under each date (why not?) using a SwiftUI ViewBuilder
.decorations { dateComponents in
Text(dateComponents.month ?? 0, format: .number)
}
日历视图用于显示日历文本的字体设计。 CalendarView 附带一个 ViewModifier 来设置此项。
CalendarView($selectedDate)
.fontDesign(.rounded)
使用 CalendarView 初始化程序中的 visibleDateComponents 参数 (Binding<DateComponents?>),您可以控制日历视图中可见的部分。 它也可用于跟踪当前正在使用的日历部分。
struct ContentView: View {
@State
private var selectedDate: DateComponents? = nil
// This sets the initial month shown to May 2024
@State
private var currentlyViewedComponents: DateComponents? = .init(
calendar: calendar,
year: 2024,
month: 5
)
var body: some View {
CalendarView(
$selectedDate,
visibleDateComponents: $currentlyViewedComponents
)
}
}
重要提示
如果 visibleDateComponents 的 calendar 属性设置为与视图的 calendar 不同的 Calendar(请参阅 环境值),则视图使用当前 Environment 的 calendar,这可能导致来自日期组件的无效日期。
使用 CalendarView 初始化程序中的 availableDateRange 参数 (DateInterval),您可以控制日历视图能够显示的日期范围。 设置此参数会限制日历视图显示的**最早**或**最晚**日期。 默认日期范围是从 distantPast 到 distantFuture。
为了方便起见,该软件包附带一个额外的协议:DateRangeExpression,它允许从一些范围类型初始化 DateInterval。 此外,它还支持使用带有 Date 值的“Range-literal”语法来创建 DateInterval 值。 具体来说,它适用于以下语法
ClosedRange: date1...date2PartialRangeFrom: date1...distantFuture。PartialRangeThrough: ...date2distantPast。CalendarView(
$selectedDate,
// This would only allow the user to select
// a date from the current moment in time onward.
availableDateRange: Date.now...
)