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
相关产品推荐
相关产品推荐

