Swift Bar Mark图表自定义轴范围时视图溢出问题求助
问题原因
使用chartYScale(domain:)自定义Y轴范围后,BarMark默认会从0值开始绘制条形,而非你设置的Y轴最小值(比如示例里的minWeight -5)。当0不在自定义的Y轴范围内时,条形的起始端会超出图表视图的可视区域,造成溢出的视觉效果。
解决方案
放弃直接使用y:参数,改用yStart:和yEnd:明确指定条形的起始与结束值,将起始值设为自定义Y轴的最小值,结束值设为体重测量值。
步骤1:优化范围计算函数(可选)
把原来返回数组的WeightRange()改成返回ClosedRange<Double>,使用起来更直观:
func weightRange() -> ClosedRange<Double> { guard !weights.isEmpty else { return 0...100 } let maxWeight = weights.map(\.measurement).max()! let minWeight = weights.map(\.measurement).min()! return (minWeight - 5)...(maxWeight + 5) }
步骤2:修改BarMark的参数
调整Chart中的BarMark,用yStart和yEnd替代y:
struct Main: View { // 提前计算Y轴范围,避免重复计算 let yRange = weightRange() var body: some View { Chart(weights) { weight in BarMark( x: .value("Date", weight.date, unit: .day), yStart: .value("Y轴最小值", yRange.lowerBound), yEnd: .value("体重", weight.measurement) ) } .chartYScale(domain: yRange) .chartXScale(domain: [Date().addingTimeInterval(-3600*25*7*4), Date()]) .padding(.horizontal, 40) .padding(.top, 10) .padding(.bottom, 20) .frame(height: 200) } }
原理说明
yStart和yEnd明确定义了条形的上下边界,让BarMark从你自定义的Y轴最小值开始绘制,到数据值结束,这样条形就会完全落在图表的可视范围内,不会再出现溢出问题。
内容的提问来源于stack exchange,提问作者Andrew97p
相关产品推荐
相关产品推荐

