Charts: Benutzerdefinierter Y-Wert-Formatierer

Erstellt am 12. Apr. 2016  ·  11Kommentare  ·  Quelle: danielgindi/Charts

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

feature

Hilfreichster Kommentar

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()

Alle 11 Kommentare

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.

  • Wenn ChartXAxisValueFormatter ausreicht, implementieren Sie das Protokoll. Ich kann dir damit helfen.
  • Wenn nicht, ist es am einfachsten, eine Unterklasse von NSNumberFormatter zu schreiben, die stringFromNumber überschreibt, und diesen Wert an einen NSDateFormatter zu übergeben, oder eine eigene benutzerdefinierte Formatierung durchzuführen.
  • Wenn Sie sich wohl fühlen, die Bibliothek zu ändern, können Sie den Pull-Request in #742 in Ihren eigenen Fork einbinden und einen NSDateFormatter übergeben, der meiner Meinung nach die Zeit nach Ihren Wünschen formatieren kann. Oder Sie können einen ChartYAxisValueFormatter hinzufügen, der dem ChartXAxisValueFormatter nachempfunden ist.

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.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

PrashantKT picture PrashantKT  ·  3Kommentare

ahmedsafadii picture ahmedsafadii  ·  3Kommentare

guanyanlin picture guanyanlin  ·  3Kommentare

coop44483 picture coop44483  ·  3Kommentare

BrandonShega picture BrandonShega  ·  4Kommentare