Charts: Formateur de valeur Y personnalisée

Créé le 12 avr. 2016  ·  11Commentaires  ·  Source: danielgindi/Charts

Tout d'abord, cette bibliothèque IOS est géniale ! Merci.

Je dois afficher les valeurs Y dans un BarChart au format temporel (mn:ss)

J'ai vu sur la documentation IOS qu'une classe appelée "ChartDefaultXAxisValueFormatter", mais je ne trouve pas le moyen de l'utiliser.

Quelqu'un a-t-il réussi une telle chose ?

Alexis

feature

Commentaire le plus utile

Je l'ai réalisé en héritant de IAxisValueFormatter .

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))!
    }
}

créer la classe YAxisValueFormatter et affecter l'objet au graphique leftAxis

    // Number formatting of YAxis
    chartView.leftAxis.valueFormatter = YAxisValueFormatter()

Tous les 11 commentaires

Avez-vous regardé l'exemple du contrôleur de vue de graphique à barres empilées ? J'imagine que c'est pareil où tu passes un formateur ?

        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 l'a souligné. Sachez qu'il s'agit actuellement d'un formateur de nombres, vous devrez donc peut-être écrire du code pour relier le formateur de nombres et de dates.

Salut,

Merci votre réponse. Malheureusement, leftAxis.valueformatter n'accepte que NSNumberFormatter.

J'essaie d'utiliser le ChartDefaultXAxisValueFormatter comme dans les fichiers Swift, mais je n'arrive pas à le mettre en œuvre.

Ce qu'il faut, c'est afficher l'axe gauche (Y) en tant que temps ex = 1:02:58

Alexis

Salut, je suppose que ce que vous voulez, c'est passer un NSDateFormatter?

Je vois ça dans la définition :
public var valueFormatter : ChartXAxisValueFormatter ?

Vous devez donc faire en sorte qu'une de vos classes implémente ce protocole

<strong i="9">@interface</strong> MyChartViewController: < ChartXAxisValueFormatter>

ou

<strong i="13">@interface</strong> MyCustomFormatter: NSObject < ChartXAxisValueFormatter>

ou l'équivalent rapide.

Mais il semble que vous souhaitiez formater les yVals, ce qui signifie que vous n'avez accès qu'à un NSNumberFormatter. Droit?

Nous avons actuellement une discussion sur un problème similaire à celui-ci dans #742. Cependant, la position de @danielgindi semble actuellement être que cela est incorrect.

Donc je pense que vous avez 3 options.

  • Si ChartXAxisValueFormatter est suffisant, implémentez le protocole. Je peux vous aider avec ça.
  • Sinon, la chose la plus simple à faire est d'écrire une sous-classe de NSNumberFormatter qui remplace stringFromNumber et de transmettre cette valeur à un NSDateFormatter, ou d'effectuer votre propre formatage personnalisé.
  • Si vous vous sentez à l'aise de modifier la bibliothèque, vous pouvez fusionner la demande d'extraction dans #742 avec votre propre fork et passer un NSDateFormatter, qui, je pense, pourra formater l'heure à votre guise. Ou vous pouvez ajouter un ChartYAxisValueFormatter sur le modèle du ChartXAxisValueFormatter.

Notez que je suis assez nouveau dans cette merveilleuse bibliothèque qui a beaucoup d'excellentes options que je ne connais pas, donc je peux manquer quelque chose d'évident.

vos suggestions sont appréciées. Nous devons bien réfléchir si nous voulons déplacer le formateur d'axe vers les formateurs. Pensant que toutes les données sont naturellement des nombres, nous pensons que le formateur de nombres est le formateur à utiliser. Si vous souhaitez afficher des chaînes différentes de la valeur, vous pouvez personnaliser la vôtre. Mais la source du formateur est le nombre à coup sûr.

J'ai utilisé la méthode de remplacement. Ça a marché comme sur des roulettes!
Merci les gars, vous êtes les meilleurs :)

NSNumberFormatter est plus correct que NSFormatter simplement parce que la valeur transmise est _toujours_ un nombre. Vous ne gagnez rien en utilisant spécifiquement NSFormatter . Le fait que vous vouliez une sortie qui ne soit pas un nombre ne change pas le fait que l'entrée soit un nombre et que vous souhaitiez formater ce nombre d'une manière très spéciale.

Nous allons, cependant, aller de l'avant avec notre propre interface qui transmet plus d'informations avec la valeur (l'approche ChartYAxisValueFormatter ).

Cela dit, ce problème devrait rester ouvert jusqu'à ce que nous implémentions le protocole pour un formateur de valeur d'axe Y.

Implémenté dans Charts 3.0 (branche v3)

Je l'ai réalisé en héritant de IAxisValueFormatter .

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))!
    }
}

créer la classe YAxisValueFormatter et affecter l'objet au graphique leftAxis

    // Number formatting of YAxis
    chartView.leftAxis.valueFormatter = YAxisValueFormatter()

Lorsque j'hérite de IAxisValueFormatter comme indiqué ci-dessus, j'obtiens une erreur : "Aucun type ou protocole nommé 'IChartAxisValueFormatter'" dans mon fichier ProjectName-Swift.h.

Cette page vous a été utile?
0 / 5 - 0 notes