如何在图表中设置自定义 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
}
}
我正在使用 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
}
}