You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift Charts折线图:y值为nil时仍在X轴显示对应日期

解决Swift Charts固定7天X轴范围的问题

你遇到的核心问题是Swift Charts默认会根据有有效数据的标记点自动计算坐标轴范围,首尾日期的averageWeight为nil时,对应的LineMark不会被创建,导致图表忽略这些日期、缩小X轴范围。要强制显示完整7天,需从数据源和轴范围设置两方面入手:

1. 确保数据源是完整的7天数组

不管某天有没有体重数据,都要为最近7天的每个日期创建对应的WeightChartData对象,不能因为averageWeight为nil就跳过该日期。

示例代码:

// 生成最近7天的日期(统一取每天的起始时间,避免时间部分干扰)
private func getLast7Days() -> [Date] {
    let calendar = Calendar.current
    let todayStart = calendar.startOfDay(for: Date())
    return (0...6).compactMap { offset in
        calendar.date(byAdding: .day, value: -offset, to: todayStart)
    }.sorted() // 按从最早到今日的顺序排列
}

// 构建完整的图表数据源
private var fullWeekChartData: [WeightChartData] {
    let last7Days = getLast7Days()
    return last7Days.map { date in
        // 从你的原始数据中匹配对应日期的体重值,无数据则为nil
        let matchedWeight = yourRawWeightData.first { data in
            calendar.isDate(data.date, inSameDayAs: date)
        }?.averageWeight
        return WeightChartData(date: date, averageWeight: matchedWeight)
    }
}

2. 强制锁定X轴范围

通过chartXScale(domain:)方法指定X轴的起始和结束日期,覆盖图表的自动范围计算逻辑,确保X轴始终显示完整7天。

完整图表实现示例:

Chart(fullWeekChartData) { dataPoint in
    // 仅当有体重数据时绘制折线和点标记
    if let weight = dataPoint.averageWeight {
        LineMark(
            x: .value("日期", dataPoint.date),
            y: .value("体重", weight)
        )
        PointMark(
            x: .value("日期", dataPoint.date),
            y: .value("体重", weight)
        )
    }
}
// 强制设置X轴范围为7天的首尾日期
.chartXScale(domain: [fullWeekChartData.first!.date, fullWeekChartData.last!.date])
// 自定义X轴刻度样式(模仿苹果健康的星期显示)
.chartXAxis {
    AxisMarks(position: .bottom) { value in
        guard let date = value.as(Date.self) else { return }
        AxisGridLine()
        AxisTick()
        AxisLabel(content: {
            Text(date.formatted(.dateTime.weekday(.short))) // 显示星期缩写,如"一""二"或"Mon""Tue"
        })
    }
}

关键注意事项

  • 日期必须统一为每天的起始时间(如00:00:00),避免因时间不同导致X轴刻度错位。
  • 即使averageWeight为nil,数据源中也必须保留该日期的WeightChartData对象,否则chartXScale的范围设置可能失效。

内容的提问来源于stack exchange,提问作者mottzi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 20:25:20