如何在图表中设置自定义 x 轴 0 标签 ios

How to set a custom x axis 0 label in charts ios

我正在使用 Charts by Daniel Gindi

如何在 x 轴上设置字符串 0 标签?我希望它显示“现在”而不是日期类型。 我见过仅有助于格式化一个特定标签的功能,但我不明白它是如何工作的。而且,我还没有看到任何例子。那么,getFormattedLabel(index: Int) 是如何工作的呢? 这就是我需要我的 xAxis 的样子:

谢谢!

您可以将 xAxis.valueFormatter 设置为您自己的自定义 class,然后在 x 值为 0 时设置 return。 喜欢:

class ChartValueFormatter: NSObject, IAxisValueFormatter {

    func stringForValue(_ value: Double, axis: AxisBase?) -> String {

        if value == 0 {

            return "Now"
        }

        let dateFormatter = DateFormatter()
        dateFormatter.setLocalizedDateFormatFromTemplate("dd MMM")
        dateFormatter.locale = .current

        let date = Date(timeIntervalSince1970: value)

        return dateFormatter.string(from: date)
    }
}

为此,您需要根据日期对值进行排序,然后将值时间戳设置为零。

想了好久,终于找到了a great tutorial on Medium by Spencer Mandrusiak

我需要制作字符串类型的第一个标签,其他所有标签仍应为日期类型。 我做了什么:

  • 创建了 X 轴格式 class。
  • 添加了一个只有一个标签的枚举
  • 当 returning 一个值时,我 return 时间如果没有自定义标签。

这个解决方案很适合我!

class ChartXAxisFormatter: NSObject, IAxisValueFormatter {

    enum CustomLabel: Int {
        case firstLabel

        var label: String {
            switch self {
            case .firstLabel: return "Now"                
                }
            }
        }

 func stringForValue(_ value: Double, axis: AxisBase?) -> String {
            let dateFormatterPrint = DateFormatter()
            dateFormatterPrint.dateFormat = "hh:mm"

            let date = Date(timeIntervalSince1970: value)
            let time = dateFormatterPrint.string(from: date)

            let intVal = Int(value)
            let customLabel = CustomLabel(rawValue: intVal)
            return customLabel?.label ?? "\(time)"


    }
}

这是一个片段,它帮助我将 X 轴转换为时间轴,并使图表上的最后一个标签成为字符串类型。

index == count - 2是因为强行把X轴的标签数设置为3:

chart.xAxis.setLabelCount(3, force: true)
chart.xAxis.avoidFirstLastClippingEnabled = false
chart.xAxis.forceLabelsEnabled = true
class ChartXAxisFormatter: NSObject, IAxisValueFormatter {

    func stringForValue(_ value: Double, axis: AxisBase?) -> String {

        if let index = axis?.entries.firstIndex(of: value), let count = axis?.entries.count  , index == count - 2 {
            return "Now"
        }

        let dateFormatterPrint = DateFormatter()
        dateFormatterPrint.dateFormat = "HH:mm:ss"

        let date = Date(timeIntervalSince1970: value)
        let time = dateFormatterPrint.string(from: date)

            return time
      }
}