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

iOS Charts柱状图显示异常求助:滚动/新增图表后样式错乱

解决danielgindi/Charts柱状图复用后X轴覆盖问题(保留可见范围限制)

你遇到的问题核心是TableView单元格复用后,setVisibleXRangeMaximum的设置和分组柱状图的X轴范围计算逻辑冲突,加上旧单元格的残留配置干扰,导致数据集堆叠覆盖X轴。下面是几个既能保留X轴可见范围限制,又能修复显示异常的可行方案:

1. 先重置X轴配置,再重新初始化

在configureBarChart方法最开头,先清空旧单元格的X轴残留配置,避免复用干扰:

func configureBarChart(xTitle: IndexAxisValueFormatter, index: Int, chartData: BarChartData, chartType: String) {
    // 重置X轴核心配置,清除复用残留
    barChartView.xAxis.resetCustomAxisMinMax()
    barChartView.xAxis.axisMinimum = 0
    barChartView.xAxis.axisMaximum = 0
    barChartView.setVisibleXRange(minXRange: 0, maxXRange: .greatestFiniteMagnitude)
    
    // 你的原有配置代码
    barChartView.data?.setDrawValues(false)
    barChartView.doubleTapToZoomEnabled = false
    barChartView.chartDescription?.enabled = false
    barChartView.animate(xAxisDuration: 1)
    // ... 其他原有配置逻辑

2. 调整setVisibleXRangeMaximum的调用时机

分组柱状图的groupBars方法会修改X轴的实际范围,所以要确保在groupBars执行完成后,再设置可见范围限制,修改代码顺序如下:

// 原有分组柱状图逻辑
if chartType == "clustered" {
    barChartView.xAxis.axisMaximum = Double(startYear) + gg * Double(groupCount)
    chartData.groupBars(fromX: Double(startYear), groupSpace: groupSpace, barSpace: barSpace)
} else {
    barChartView.xAxis.axisMaximum = Double(startYear) + 1 * Double(groupCount)
}

// 把可见范围限制移到X轴范围确定后执行
if xTitle.values.count >= 10 {
    barChartView.setVisibleXRangeMaximum(12)
} else {
    barChartView.setVisibleXRangeMaximum(Double(xTitle.values.count))
}
barChartView.setScaleEnabled(false)

3. 用更明确的范围设置方法替代

如果setVisibleXRangeMaximum仍有问题,可以尝试使用setVisibleXRange(minXRange:maxXRange:),明确指定最小和最大可见范围:

let maxVisibleRange = xTitle.values.count >= 10 ? 12.0 : Double(xTitle.values.count)
barChartView.setVisibleXRange(minXRange: 0, maxXRange: maxVisibleRange)

4. 在单元格复用前主动重置图表

在你的柱状图单元格类中,重写prepareForReuse方法,提前清空图表数据和配置,从根源避免复用残留:

// 柱状图单元格类中
override func prepareForReuse() {
    super.prepareForReuse()
    barChartView.data = nil
    barChartView.xAxis.resetCustomAxisMinMax()
    barChartView.setVisibleXRange(minXRange: 0, maxXRange: .greatestFiniteMagnitude)
}

这些方案的核心是确保每次配置图表时,X轴的范围、可见性设置都是基于当前数据重新计算的,彻底避免旧单元格的配置干扰新图表的渲染逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:52:07