Swift Charts中如何将BarMark X轴今日日期标签改为蓝色
解决Swift Charts中单独高亮今日X轴标签的问题
要实现仅将X轴中今日日期的标签设为蓝色,核心是针对每个轴标记动态判断日期并设置颜色,具体修改如下:
- 在视图中添加日历实例和今日日期的计算属性(忽略时分秒,确保只比较年月日):
private let calendar = Calendar.current private var today: Date { calendar.startOfDay(for: Date()) }
- 修改
chartXAxis部分,通过AxisMarks的context获取当前标记的日期,判断是否为今日后再设置颜色:
.chartXAxis { AxisMarks(values: .stride(by: .day, count: 1)) { context in AxisTick() // 将context.value转为Date类型,判断是否与今日为同一天 let isToday = calendar.isDate(context.value as! Date, inSameDayAs: today) AxisValueLabel(format: .dateTime.month().day()) .foregroundStyle(isToday ? Color.blue : .primary) } }
完整修改后的代码
struct DailyPointsChart: View { @Binding var scrollPosition: Date let chartData: [(Date, Int)] private let calendar = Calendar.current private var today: Date { calendar.startOfDay(for: Date()) } var body: some View { Chart { ForEach(chartData, id: \.0) { data in BarMark( x: .value("Day", data.0, unit: .day), y: .value("Points", data.1) ) } .cornerRadius(10) .foregroundStyle(Color(UIColor.purple)) } .chartScrollableAxes(.horizontal) .chartXVisibleDomain(length: 3600 * 24 * 7) // 7 visible days on chart .chartScrollPosition(x: $scrollPosition) .chartXAxis { AxisMarks(values: .stride(by: .day, count: 1)) { context in AxisTick() let isToday = calendar.isDate(context.value as! Date, inSameDayAs: today) AxisValueLabel(format: .dateTime.month().day()) .foregroundStyle(isToday ? Color.blue : .primary) } } } }
关键说明
- 使用
Calendar.isDate(_:inSameDayAs:)可以忽略日期中的时分秒部分,确保即使chartData中的日期包含具体时间,也能正确匹配今日。 .primary是系统默认的文本颜色,保证非今日标签保持原有样式。
内容的提问来源于stack exchange,提问作者Henry Noon
相关产品推荐
相关产品推荐

