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

SciChart iOS:固定X轴网格线与刻度标签于可视范围中点

实现X轴刻度与网格线固定在可视范围中点的方案

我明白你想要实现的效果——不管图表进行缩放或平移操作,X方向的网格线和刻度标签都牢牢固定在可视范围的中点位置。你尝试自定义SCIDateTimeTickProvider的思路完全正确,下面我来帮你补全并优化这个实现:

完整的自定义TickProvider实现

import SciChart

class CenterFixedDateTimeTickProvider: SCIDateTimeTickProvider {
    // 可自定义是否显示中点对称刻度,默认仅保留中点刻度
    private let keepOnlyCenterTick: Bool = true
    
    override func getMajorTicks(fromAxis axis: SCIAxisCoreProtocol!) -> SCIArrayController! {
        guard let visibleRange = axis.visibleRange as? SCIDateRange,
              let minDate = visibleRange.min,
              let maxDate = visibleRange.max else {
            // 可视范围无效时回退到默认逻辑
            return super.getMajorTicks(fromAxis: axis)
        }
        
        // 计算可视范围的中点时间
        let minTime = minDate.timeIntervalSince1970
        let maxTime = maxDate.timeIntervalSince1970
        let centerTime = minTime + (maxTime - minTime) / 2
        let centerDate = Date(timeIntervalSince1970: centerTime)
        
        if keepOnlyCenterTick {
            // 仅返回中点刻度
            let tickValues = SCIDoubleValues()
            tickValues.add(centerDate.timeIntervalSince1970)
            return tickValues
        } else {
            // 如需中点左右对称刻度,可扩展此逻辑
            let tickValues = SCIDoubleValues()
            tickValues.add(centerTime - 3600) // 中点前1小时
            tickValues.add(centerTime)
            tickValues.add(centerTime + 3600) // 中点后1小时
            return tickValues
        }
    }
    
    // 让次要网格线同步固定在中点,保证视觉一致性
    override func getMinorTicks(fromAxis axis: SCIAxisCoreProtocol!) -> SCIArrayController! {
        return self.getMajorTicks(fromAxis: axis)
    }
}

如何应用到X轴

在图表初始化阶段,将自定义Provider绑定到X轴即可:

let xAxis = SCIDateAxis()
// 应用自定义刻度生成器
xAxis.tickProvider = CenterFixedDateTimeTickProvider()
// 保持日期标签格式正常显示
xAxis.labelProvider = SCIDateLabelProvider()
// 其他轴配置(如轴标题、样式等)...

关键逻辑说明

  • 中点计算:通过读取X轴当前visibleRange的首尾时间戳,计算出精确的中点时间,作为核心刻度值
  • 容错处理:当可视范围无效时,自动回退到父类的默认刻度生成逻辑,避免异常崩溃
  • 可扩展性:如果需要在中点两侧生成对称刻度,只需修改keepOnlyCenterTick为false,并调整刻度生成规则
  • 网格线同步:重写getMinorTicks方法,让次要网格线与主刻度保持一致,确保平移/缩放时网格线始终锁定中点

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:43:57