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

Swift Charts中chartScrollTargetBehavior无法可靠对齐单日单位的问题求助

Swift Charts中chartScrollTargetBehavior无法可靠对齐单日单位的问题求助

我正在做一个横轴显示日期的可滚动图表,希望用户滚动时总能精准对齐到某一天。我按照WWDC23相关会话里的步骤做了以下设置:

  • 将chartScrollTargetBehavior设置为.valueAligned(matching: DateComponents(hour: 0))
  • 在BarMark的x值参数里指定单位为Calendar.Component.day

最终我的图表代码如下:

Chart(dates, id: \.self) { date in
    BarMark(
        x: .value("Date", date, unit: Calendar.Component.day),
        y: .value("Number", 1)
    )
    .annotation {
        Text(date.formatted(.dateTime.day()))
            .font(.caption2)
    }
}
.chartXAxis {
    AxisMarks(format: .dateTime.day())
}
.chartScrollableAxes(.horizontal)
.chartScrollTargetBehavior(.valueAligned(matching: DateComponents(hour: 0)))
.chartXVisibleDomain(length: fifteenDays)
.chartScrollPosition(x: $selection)

但这个实现并不可靠,经常出现异常情况:比如图表滚动位置停在10月20日晚上11:56,却自动对齐到了10月21日。

【动图说明:滚动图表过程中,日期对齐出现偏差,本该停在20日却跳转到21日】

我尝试过在状态值和图表选择之间添加一个中间绑定,想把选中的日期统一归一化到当天的零点,但这个方法并没有解决问题:

private var selectionBinding: Binding<Date> {
    Binding {
        Calendar.current.startOfDay(for: selection)
    } set: { newValue in
        self.selection = Calendar.current.startOfDay(for: newValue)
    }
}

另外值得一提的是,这个问题在苹果官方的Swift Charts示例项目里也存在。

我该如何解决这个问题?有没有办法让图表的滚动位置完全忽略时间部分,只识别完整的日期?

我已经准备了一个最小可复现的示例项目供参考。

备注:内容来源于stack exchange,提问作者Gene Bogdanovich

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 10:19:32