Charts: Formatador de valor Y personalizado

Criado em 12 abr. 2016  ·  11Comentários  ·  Fonte: danielgindi/Charts

Em primeiro lugar, essa biblioteca IOS é incrível! Obrigado.

Tenho que exibir os valores Y em um BarChart no formato de hora (mn: ss)

Eu vi na documentação do IOS que uma classe chamada "ChartDefaultXAxisValueFormatter", mas não consigo encontrar uma maneira de usá-la.

Alguém conseguiu tal coisa?

Alexis

feature

Comentários muito úteis

Eu consegui herdando 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))!
    }
}

crie YAxisValueFormatterclass e atribua o objeto ao gráfico leftAxis

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

Todos 11 comentários

Você já viu o exemplo de controlador de exibição de gráfico de barras empilhadas? Imagino que seja parecido onde vc passa um formatador?

        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 apontou isso. Esteja ciente de que ele é um formatador de número agora, então você pode precisar escrever algum código para ligar o formatador de número e data.

Olá,

Obrigado sua resposta. Infelizmente, leftAxis.valueformatter só aceita NSNumberFormatter.

Estou tentando usar o ChartDefaultXAxisValueFormatter como nos arquivos swift, mas não consigo implementá-lo.

O que é necessário é exibir o eixo esquerdo (Y) como tempo ex = 1:02:58

Alexis

Oi, suponho que o que você deseja é passar um NSDateFormatter?

Eu vejo isso na definição:
public var valueFormatter: ChartXAxisValueFormatter?

Então você precisa que uma de suas classes implemente esse protocolo

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

ou

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

ou o equivalente rápido.

Mas parece que você deseja formatar yVals, o que significa que você só tem acesso a um NSNumberFormatter. Direito?

Na verdade, estamos discutindo um problema semelhante a este em # 742. No entanto, a posição de @danielgindi atualmente parece ser que isso está incorreto.

Então, acho que você tem 3 opções.

  • Se ChartXAxisValueFormatter for suficiente, implemente o protocolo. Eu posso te ajudar com isso.
  • Se não, a coisa mais simples a fazer é escrever uma subclasse de NSNumberFormatter que sobrescreve stringFromNumber e passa esse valor para um NSDateFormatter, ou realizar sua própria formatação personalizada.
  • Se você se sentir confortável para modificar a biblioteca, pode mesclar a solicitação de pull em # 742 em seu próprio fork e passar um NSDateFormatter, que acho que será capaz de formatar o tempo como desejar. Ou você pode adicionar um ChartYAxisValueFormatter modelado no ChartXAxisValueFormatter.

Observe que sou bastante novo nesta biblioteca maravilhosa, que tem muitas opções excelentes com as quais não estou familiarizado, então pode estar faltando algo óbvio.

suas sugestões são apreciadas. Precisamos pensar com cuidado se quisermos mover o formatador de eixo para formatadores. Pensando que todos os dados são naturalmente números, pensamos que o formatador de números é o formatador a ser usado. Caso queira exibir strings diferentes do valor, você pode personalizar o seu próprio. Mas a fonte do formatador é um número, com certeza.

Usei o método de substituição. Funcionou como um encanto!
Obrigado pessoal vocês são os melhores :)

NSNumberFormatter é mais correto do que NSFormatter simplesmente devido ao fato de que o valor que está sendo passado é _sempre_ um número. Você não ganha nada usando NSFormatter especificamente. O fato de você querer uma saída que não seja um número não muda o fato de que a entrada é um número, e você deseja formatar esse número de uma maneira muito especial.

Iremos, no entanto, avançar com nossa própria interface, que passa mais informações junto com o valor (a abordagem ChartYAxisValueFormatter ).

Dito isso - este problema deve permanecer aberto até que implementemos o protocolo para um formatador de valor do eixo Y.

Implementado no Charts 3.0 (branch v3)

Eu consegui herdando 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))!
    }
}

crie YAxisValueFormatterclass e atribua o objeto ao gráfico leftAxis

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

Quando herdo IAxisValueFormatter conforme declarado acima, recebo um erro: "Nenhum tipo ou protocolo denominado 'IChartAxisValueFormatter'" em meu arquivo ProjectName-Swift.h.

Esta página foi útil?
0 / 5 - 0 avaliações