Swift Charts中.chartYScale仅支持100步进 非整百值域不生效问题
问题说明
在心率图表开发场景中,尝试通过.chartYScale(domain: 0 ... 210)将图表Y轴最大刻度设置为210bpm时,发现仅传入200、300这类100整数倍数值时缩放功能可正常生效,传入区间内其他数值均无法正常工作,需要确认该表现是框架预期设计还是存在bug。
复现代码如下:
import SwiftUI import Charts import HealthKit struct TestYAxisRangeChart: View { let heartRateData = [80.0, 90.0, 120.0, 150.0, 160.0, 140.0, 125.0, 110.0, 88.0] var body: some View { Chart { ForEach(heartRateData, id: \.self) { sample in LineMark( x: .value("", heartRateData.firstIndex(of: sample)!), y: .value("HR", sample)) .foregroundStyle(Color.red) } } .chartYAxis{ AxisMarks(position: .leading) } .frame(height: 300) .padding(.horizontal) .chartYScale(domain: 0 ... 210) } } struct TestYAxisRangeChart_Previews: PreviewProvider { static var previews: some View { TestYAxisRangeChart() } }
原因解释
这不是框架bug,是Swift Charts默认轴刻度生成规则的预期行为。
默认无参数调用AxisMarks时,框架会自动选择整十、整百这类规整易读的刻度步长;如果设置的Y轴domain上限不是自动计算出的步长的整数倍,框架会自动将轴范围扩展到下一个适配步长的整数值,最终就会出现设置210上限、实际轴范围被自动撑到300的表现,看起来像是缩放配置失效。
修复方案
显式指定Y轴刻度的生成规则,覆盖默认的自动计算逻辑即可,两种常用实现方式:
- 手动枚举所有需要显示的刻度值,完全自定义刻度点位
.chartYAxis { AxisMarks(position: .leading, values: [0, 50, 100, 150, 200, 210]) { AxisGridLine() AxisTick() AxisValueLabel() } }
- 指定固定刻度步长,框架会严格按照设定的间隔在已定义的domain范围内生成刻度,不会自动扩展轴范围
.chartYAxis { AxisMarks(position: .leading, values: .stride(by: 50)) { AxisGridLine() AxisTick() AxisValueLabel() } }
修改后.chartYScale(domain: 0 ... 210)的配置会严格生效,Y轴上限将固定为210bpm。
内容的提问来源于stack exchange,提问作者GarySabo
相关产品推荐
相关产品推荐

