Zuallererst ist diese IOS-Bibliothek großartig! Vielen Dank.
Ich muss Y-Werte in einem BarChart im Zeitformat anzeigen (mn:ss)
Ich habe in der IOS-Dokumentation gesehen, dass eine Klasse namens "ChartDefaultXAxisValueFormatter" ist, aber ich kann keine Möglichkeit finden, sie zu verwenden.
Hat jemand so etwas erreicht?
Alexis
Haben Sie sich das Beispiel für den Controller für die gestapelte Balkendiagrammansicht angesehen? Ich kann mir vorstellen, dass es ähnlich ist, wo Sie einen Formatierer übergeben?
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
formatter.maximumFractionDigits = 1;
formatter.negativeSuffix = @" $";
formatter.positiveSuffix = @" $";
BarChartData *data = [[BarChartData alloc] initWithXVals:xVals dataSets:dataSets];
[data setValueFont:[UIFont fontWithName:@"HelveticaNeue-Light" size:7.f]];
[data setValueFormatter:formatter];
_chartView.data = data;
@dxclancy hat darauf hingewiesen. Beachten Sie, dass es sich im Moment um einen Zahlenformatierer handelt, daher müssen Sie möglicherweise Code schreiben, um den Zahlen- und Datumsformatierer zu überbrücken.
Hi,
Danke deine Antwort. Leider akzeptiert leftAxis.valueformatter nur NSNumberFormatter.
Ich versuche, den ChartDefaultXAxisValueFormatter wie in den Swift-Dateien zu verwenden, kann ihn jedoch nicht implementieren.
Was erforderlich ist, ist die linke (Y) Achse als Zeit ex = 1:02:58 . anzuzeigen
Alexis
Hallo, ich nehme an, was Sie wollen, ist ein NSDateFormatter zu übergeben?
Ich sehe das in der Definition:
public var valueFormatter: ChartXAxisValueFormatter?
Sie müssen also eine Ihrer Klassen dieses Protokoll implementieren lassen
<strong i="9">@interface</strong> MyChartViewController: < ChartXAxisValueFormatter>
oder
<strong i="13">@interface</strong> MyCustomFormatter: NSObject < ChartXAxisValueFormatter>
oder das schnelle Äquivalent.
Aber es hört sich so an, als ob Sie die yVals formatieren möchten, was bedeutet, dass Sie nur Zugriff auf einen NSNumberFormatter haben. Rechts?
Wir haben tatsächlich eine Diskussion über ein ähnliches Thema wie dieses in #742. Die Position von @danielgindi scheint jedoch derzeit so zu sein, dass dies falsch ist.
Also ich denke du hast 3 Möglichkeiten.
Beachten Sie, dass ich relativ neu in dieser wunderbaren Bibliothek bin, die viele großartige Optionen bietet, mit denen ich nicht vertraut bin, sodass mir möglicherweise etwas Offensichtliches fehlt.
Ihre Vorschläge werden geschätzt. Wir müssen sorgfältig überlegen, wenn wir den Achsenformatierer zu Formatierern verschieben möchten. Da alle Daten von Natur aus Zahlen sind, denken wir, dass der Zahlenformatierer der zu verwendende Formatierer ist. Falls Sie andere Zeichenfolgen als den Wert anzeigen möchten, können Sie Ihre eigenen anpassen. Aber die Quelle des Formatierers ist sicher Zahl.
Ich habe die Override-Methode verwendet. Es funktionierte wie ein Zauber!
Danke Jungs, ihr seid die Besten :)
NSNumberFormatter
ist korrekter als NSFormatter
einfach weil der übergebene Wert _immer_ eine Zahl ist. Sie gewinnen nichts, wenn Sie NSFormatter
speziell verwenden. Die Tatsache, dass Sie eine Ausgabe wünschen, die keine Zahl ist, ändert nichts an der Tatsache, dass die Eingabe eine Zahl ist, und Sie möchten diese Zahl auf eine ganz besondere Weise formatieren.
Wir werden jedoch mit unserer eigenen Schnittstelle fortfahren, die mehr Informationen zusammen mit dem Wert übergibt (der ChartYAxisValueFormatter
Ansatz).
Trotzdem sollte dieses Problem offen bleiben, bis wir das Protokoll für einen Y-Achsen-Wertformatierer implementieren.
Implementiert in Charts 3.0 (v3-Zweig)
Ich habe es erreicht, indem ich IAxisValueFormatter
geerbt habe.
import Foundation
import Charts
class YAxisValueFormatter: NSObject, IAxisValueFormatter {
let numFormatter: NumberFormatter
override init() {
numFormatter = NumberFormatter()
numFormatter.minimumFractionDigits = 1
numFormatter.maximumFractionDigits = 1
// if number is less than 1 add 0 before decimal
numFormatter.minimumIntegerDigits = 1 // how many digits do want before decimal
numFormatter.paddingPosition = .beforePrefix
numFormatter.paddingCharacter = "0"
}
/// Called when a value from an axis is formatted before being drawn.
///
/// For performance reasons, avoid excessive calculations and memory allocations inside this method.
///
/// - returns: The customized label that is drawn on the axis.
/// - parameter value: the value that is currently being drawn
/// - parameter axis: the axis that the value belongs to
///
public func stringForValue(_ value: Double, axis: AxisBase?) -> String {
return numFormatter.string(from: NSNumber(floatLiteral: value))!
}
}
Erstellen Sie eine YAxisValueFormatterclass und weisen Sie das Objekt dem Graphen leftAxis zu
// Number formatting of YAxis
chartView.leftAxis.valueFormatter = YAxisValueFormatter()
Wenn ich IAxisValueFormatter wie oben angegeben erbe, erhalte ich eine Fehlermeldung: "Kein Typ oder Protokoll namens 'IChartAxisValueFormatter'" in meiner ProjectName-Swift.h-Datei.
Hilfreichster Kommentar
Ich habe es erreicht, indem ich
IAxisValueFormatter
geerbt habe.Erstellen Sie eine YAxisValueFormatterclass und weisen Sie das Objekt dem Graphen leftAxis zu