-//
-// CalendarPickerVC.swift
-// ShenYin
-//
-// Created by liangshi on 2025/11/14.
-//
-
import UIKit
import HorizonCalendar
-class CalendarPickerVC:BaseVC{
-
- var didSelectedDate:((String)->Void)?
+class CalendarPickerVC: BaseVC {
+ var didSelectedDate: ((String) -> Void)?
var monthsLayout: MonthsLayout = MonthsLayout.vertical(options: VerticalMonthsLayoutOptions(
pinDaysOfWeekToTop: false,
alwaysShowCompleteBoundaryMonths: false,
scrollsToFirstMonthOnStatusBarTap: false))
- var defaultDate:String?
- var selectedDate:Date? = Date()
- var calendarView:CalendarView!
+ var defaultDate: String?
+ var selectedDate: Date? = Date()
+ var calendarView: CalendarView!
lazy var calendar = Calendar.current
+ // 1. 创建年月格式化器
+ private lazy var monthHeaderFormatter: DateFormatter = {
+ let formatter = DateFormatter()
+ formatter.calendar = calendar
+ formatter.locale = isChinese ? Locale(identifier: "zh_CN"):Locale(identifier: "en_US")
+ if isChinese{
+ formatter.dateFormat = "yyyy年MM月"
+ }
+ else{
+ formatter.dateFormat = "yyyy-MM"
+ }
+
+ return formatter
+ }()
+
+ // 2. 创建星期格式化器(用于自定义星期显示)
+ private lazy var dayOfWeekFormatter: DateFormatter = {
+ let formatter = DateFormatter()
+ formatter.calendar = calendar
+ formatter.locale = isChinese ? Locale(identifier: "zh_CN"):Locale(identifier: "en_US")
+ // 星期格式:"E" 显示"周一","EEEEE" 显示"一",可根据需求调整
+ formatter.dateFormat = isChinese ? "E" : "EEE"
+ return formatter
+ }()
+
+ var isChinese:Bool{
+ return (DCConfig.appLanguage == .chinse || DCConfig.appLanguage == .chinse)
+ }
override func viewDidLoad() {
super.viewDidLoad()
-
-
+
navBar.titleLabel.text = "按日期查找".l10n
calendarView = CalendarView(initialContent: makeContent())
calendarView.daySelectionHandler = { [weak self] day in
- guard let self else { return }
+ guard let self = self else { return }
selectedDate = calendar.date(from: day.components)
calendarView.setContent(makeContent())
defaultDate = text
Logger.debug(text)
didSelectedDate?(text)
- DispatchQueue.main.asyncAfter(deadline:.now() + 0.3) {
+ DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
App.shared.popPage()
}
-
}
view.addSubview(calendarView)
make.left.right.equalToSuperview()
make.bottom.equalToSuperview()
}
-
-
}
- func makeContent() -> CalendarViewContent {
+
+ func makeContent() -> CalendarViewContent {
let startDate = calendar.date(from: DateComponents(year: 2025, month: 11, day: 01))!
let endDate = calendar.date(from: DateComponents(year: 2099, month: 12, day: 31))!
-// let selectedDate = selectedDate
-
- let dayDateFormatter = DateFormatter()
- dayDateFormatter.calendar = calendar
- dayDateFormatter.locale = calendar.locale
-
- dayDateFormatter.dateFormat = DateFormatter.dateFormat(
+ let dayDateFormatter = DateFormatter()
+ dayDateFormatter.calendar = calendar
+ dayDateFormatter.locale = calendar.locale
+ dayDateFormatter.dateFormat = DateFormatter.dateFormat(
fromTemplate: "EEEE, MMM d, yyyy",
options: 0,
locale: calendar.locale ?? Locale.current)
.interMonthSpacing(24)
.verticalDayMargin(8)
.horizontalDayMargin(8)
-
- .dayItemProvider { [self, calendar, dayDateFormatter] day in
+ // 月份标题配置
+ .monthHeaderItemProvider { [weak self] month in
+ guard let self = self, let monthDate = self.calendar.date(from: month.components) else {
+ return nil
+ }
+ let monthText = self.monthHeaderFormatter.string(from: monthDate)
+ let content = MonthHeaderView.Content(
+ monthText: monthText,
+ accessibilityLabel: monthText
+ )
+ var style = MonthHeaderView.InvariantViewProperties.base
+ style.font = .systemFont(ofSize: 18, weight: .semibold)
+ style.textColor = .darkGray
+ return MonthHeaderView.calendarItemModel(
+ invariantViewProperties: style,
+ content: content
+ )
+ }
+
+ // 3. 星期标题配置(自定义星期格式)
+ .dayOfWeekItemProvider { [weak self] month, weekdayIndex in // 接收两个参数:month和weekdayIndex
+ guard let self = self else { return nil }
+
+ // 使用weekdayIndex创建日期组件(1-7对应周日到周六,具体取决于日历设置)
+ let dateComponents = DateComponents(
+ calendar: self.calendar, weekday: weekdayIndex + 1
+ )
+ guard let date = self.calendar.date(from: dateComponents) else {
+ return nil
+ }
+
+ // 格式化星期文本(如“周一”“周二”)
+ let dayOfWeekText = self.dayOfWeekFormatter.string(from: date)
+
+ // 配置星期标题的样式
+ var style = DayOfWeekView.InvariantViewProperties.base
+ style.font = .systemFont(ofSize: 14, weight: .medium)
+ style.textColor = .gray
+
+ // 返回星期标题的视图模型(content参数名应为dayOfWeekText,而非text)
+ return DayOfWeekView.calendarItemModel(
+ invariantViewProperties: style,
+ content: .init(
+ dayOfWeekText: dayOfWeekText, // 修正参数名
+ accessibilityLabel: dayOfWeekText
+ )
+ )
+ }
+
+ // 日期配置
+ .dayItemProvider { [weak self, calendar, dayDateFormatter] day in
+ guard let self else { return nil } // 解包 weak self
+
var invariantViewProperties = DayView.InvariantViewProperties.baseInteractive
let date = calendar.date(from: day.components)
let selectedDate = date?.format(.short)
if let text = defaultDate, selectedDate == text {
-// invariantViewProperties.backgroundShapeDrawingConfig.borderColor = .blue
invariantViewProperties.backgroundShapeDrawingConfig.fillColor = .color(.theme).withAlphaComponent(0.5)
}
-
-
-// return DayView.calendarItemModel(
-// invariantViewProperties: invariantViewProperties,
-// content: .init(
-// dayText: "\(day.day)",
-// accessibilityLabel: date.map { dayDateFormatter.string(from: $0) },
-// accessibilityHint: nil))
return DayView.calendarItemModel(
invariantViewProperties: invariantViewProperties,
content: .init(