Charts: (v3.0 + Swift3.0) ChartView highlightValueWithX não funciona

Criado em 20 set. 2016  ·  23Comentários  ·  Fonte: danielgindi/Charts

O método ChartView highlightValueWithX parece parar de funcionar para v3.0 + Swift3.0
Xcode 8 / Filial mestre / Objc.

bug ★★★

Comentários muito úteis

Altere esta linha: lineChartView.highlightValue (x: 3, dataSetIndex: 0)

para: lineChartView.highlightValue (Destaque (x: 3, y: 0, dataSetIndex: 0)

Todos 23 comentários

As funções @PhilJay highlightValue(x...) estão falhando, porque o renderizador de destaque espera que um valor Y esteja presente. O resultado é um NaN, o que faz com que ele não renderize em lugar nenhum ...

Android e iOS?

Sim...

Hmmm ... acabei de olhar o código, este é complicado. Para o caso de termos várias entradas na mesma posição x, não será possível destacar com sucesso uma determinada entrada sem qualquer especificação da posição y.

Então, talvez devêssemos abandonar esse método?
Outra opção seria incluir a posição y no método (como um parâmetro)?

Bem, o problema começa com a seleção de eventos de toque - ainda não funciona realmente, se você tiver um gráfico de dispersão ou bolha com vários valores no mesmo x. Na verdade, ele seleciona o primeiro ou o último no mesmo x - dependendo da posição do toque no eixo X!

Depois de consertarmos isso - eu acho que o algoritmo saberá tomar um valor de Y e depois de atingir o X correto, ele começará a procurar pelo Y correto.
E então teremos a opção de passar um valor Y, como um método separado! :-)
O original, para destacar simplesmente por um X é muito útil e muitas pessoas dependem dele, a julgar pelos problemas ... Então, vamos receber mensagens de ódio se removermos isso :-)

Existe alguma alternativa atual para destacar programaticamente um item do gráfico de linha? Todos os métodos de realce estão quebrados no momento?

O gráfico de linhas

O destaque programático ainda não está funcionando em gráficos de linha.

Tento destacar o último valor:

[self.lineChartView highlightValueWithX:self.lineChartView.chartXMax dataSetIndex:0 callDelegate:YES];

Mas no método delegado - (void) chartValu eSelected: entry : realce: realce.xPx e

Posso reconfirmar que o realceValueWithX não está funcionando.

Eu tentei criar um destaque
ChartHighlight * high = [[ChartHighlight alloc]initWithX:(double)someInt dataSetIndex:0];
e usei o método highlightValueWithHighlight com ele, mas ainda não destaca. O método chartValueSelected: entry: highlight: delegate é chamado, que contém os valores corretos no objeto de entrada, mas o objeto de destaque tem um NaN no valor y.

Existe alguma maneira de criar um objeto ChartHighlight * contendo o valor y também? Vejo vários métodos de inicialização para a classe ChartHighlight, mas todos os outros precisam de posições de pixel absolutas.

@ liuxuan30 Você pode apontar qual parte da demonstração de gráficos destaca um gráfico de maneira programática?

Como alternativa, existe uma maneira de mostrar a entrada atualmente selecionada em qualquer outro mecanismo além de usar o realce?

Isso é absolutamente essencial para o TVOS, já que os gráficos não suportam o ambiente de foco e as interações do usuário no gráfico precisam ser tratadas de forma programática, em vez de depender dos reconhecedores de gestos integrados.

Para contornar esse problema, fiz o seguinte em minha cópia local:

Em Highlight.swift, adicione um inicializador que também tenha um valor y:

    /// - parameter x: the x-value of the highlighted value
    /// - parameter y: the y-value of the highlighted value
    /// - parameter dataSetIndex: the index of the DataSet the highlighted value belongs to
    public init(x: Double, y: Double, dataSetIndex: Int)
    {
        _x = x
        _y = y
        _dataSetIndex = dataSetIndex
    }

Então, quando quero realçar programaticamente, faço assim:

   let entry = //... the ChartDataEntry I want to highlight
   self.chart.highlightValue(
       Highlight(x: entry.x, y: entry.y, dataSetIndex: 0)
   )

Definitivamente, não estou familiarizado o suficiente com o código para saber se essa é uma abordagem decente para seguir em frente ou não. Se for, acho que uma coisa que ajudaria seria ChartData.highlightForEntry() -> Highlight agir como o inverso de ChartData.entryForHighlight()

Na verdade, olhando mais de perto, descobri que houve correções recentes para alguns dos outros renderizadores que não foram aplicadas aos gráficos de linha.

Neste commit:

https://github.com/danielgindi/Charts/commit/8905a46c8262998ccdb780bbd5d2c03e45b8ab5a#diff -52d760df99fc778bb8222bd3cc9ce413R225

As variáveis x e y foram alteradas para virem de entry , não do Destaque h . Acho que se essa mesma correção fosse aplicada a LineChartRenderer o problema seria corrigido.

Vou tentar fazer isso e espero conseguir um PR para ele pronto hoje, se o tempo permitir.

Além disso, não parece que o valor y seja realmente usado, uma vez que a linha de destaque vai de contentTop para contentBottom. A raiz do problema é, na verdade, nesta linha:

let pt = trans.pixelForValues(x: x, y: y)

Se y for NaN então pt.x também será NaN . Na verdade, parece ser um bug do Swift 3 / CoreGraphics, conforme evidenciado no Swift Repl aqui:

  7> import CoreGraphics
  8> let trans = CGAffineTransform(scaleX: 1.0, y: 1.0)
trans: CGAffineTransform = {
  a = 1
  b = 0
  c = 0
  d = 1
  tx = 0
  ty = 0
}
  9> let pt = CGPoint(x: 1.0, y: Double.nan)
pt: CGPoint = (x = 1, y = NaN)
 10> pt.applying(trans)
$R2: CGPoint = (x = NaN, y = NaN)

@apurva você pode tentar meu fix-1495 branch aqui:

https://github.com/ryanschneider/Charts/tree/fix-1495

E ver se funciona conforme o esperado para você? Está funcionando para mim. @danielgindi & @ liuxuan30 , eu mais ou menos copiei o código de ScatterChartRenderer mas adicionei a verificação if x > chartXMax * animator.phaseX que LineChartRenderer tinha.

Eu não _ acho_ que preciso iterar mais de set.entriesForXValue(high.x) mas atualmente estou. Não acho que haja mal, já que nunca deve haver mais de uma entrada, mas se você puder confirmar que é esse o caso, ficarei feliz em reduzir para uma única chamada de set.entryForXValue(high.x) e enviar um PR.

Também seria bom adicionar uma opção de destaque programático ao ChartsDemo para ajudar no teste de regressão de bugs de destaque, mas não investiguei o que seria necessário para fazer isso.

Obrigado por seus esforços @ryanschneider ! @danielgindi o que você acha?

@ryanschneider Obrigado por seus esforços. Eu tentei as mudanças em seu branch, mas ambos os métodos highlightValueWithX e highlightValueWithHighlight ainda não funcionam para mim. O valor y do destaque ainda é NaN e o destaque não é desenhado no gráfico quando chamado programaticamente.

@danielgindi Acabei de testar com o mestre mais recente, incluindo seu commit em https://github.com/danielgindi/Charts/commit/32a5952cae25f864c5fd3a449e4f413da7f36f9b

destaqueValueWithX ainda não mostra as linhas de destaque. O delegado é demitido e o valor y de destaque ainda é NaN no delegado. Como no caso anterior, o realce por meio dos reconhecedores de gestos mostra as linhas de realce, mas não quando o realceValueWithX é chamado.

Ainda não funciona.

Ainda não está funcionando para mim no Swift 3.

`class ChartsViewController: UIViewController {

<strong i="7">@IBOutlet</strong> var lineChartView: LineChartView!

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.

    let months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun"]
    let unitsSold = [20.0, 4.0, 6.0, 3.0, 12.0, 16.0]

    setChart(dataPoints: months, values: unitsSold)

}

func setChart(dataPoints: [String], values: [Double]) {

    var dataEntries: [ChartDataEntry] = []

    for i in 0..<dataPoints.count {
        let dataEntry = ChartDataEntry(x: Double(i), y: values[i])
        dataEntries.append(dataEntry)
    }

    let lineChartDataSet = LineChartDataSet(values: dataEntries, label: "Units Sold")
    let lineChartData = LineChartData(dataSet: lineChartDataSet)
    lineChartDataSet.highlightLineWidth = 2
    lineChartDataSet.highlightColor = UIColor.red

    lineChartView.data = lineChartData

    lineChartView.highlightValue(x: 3, dataSetIndex: 0)

    }

} `

Altere esta linha: lineChartView.highlightValue (x: 3, dataSetIndex: 0)

para: lineChartView.highlightValue (Destaque (x: 3, y: 0, dataSetIndex: 0)

Tentei especificar ay: 0 em um gráfico de linha com vários conjuntos de dados e ainda não funcionou. Existe alguma atualização sobre isso? É um bug bem grande.

Estou ligando do Objetivo C.

Pequeno truque para obter a posição do valor destacado

// Highlight set programmatically
let dataEntry = dataEntries[linechartData.entryCount-1]
self.lineChartView.highlightValue(Highlight(x:` dataEntry.x, y:dataEntry.y, dataSetIndex: 0), callDelegate:` true)
func chartValueSelected(_ chartView: ChartViewBase, entry: ChartDataEntry, highlight: Highlight) {
        var markerPosition = CGPoint(x:highlight.xPx, y: highlight.yPx)
        // Hack to get the real position of the highlight programaticaly
        if markerPosition.x.isNaN || markerPosition.y.isNaN{
            let transformer = lineChartView.getTransformer(forAxis: lineChartView.leftAxis.axisDependency)
            let pt = transformer.pixelForValues(x: entry.x, y: entry.y)
            markerPosition.x = pt.x
            markerPosition.y = pt.y
        }
}

Eu tentei seu hack, jndefosse, mas como posso chamar a função para mostrar os rótulos apenas quando a entrada está destacada?

Este bug foi corrigido? Não consigo destacar uma seção nos gráficos de pizza do iOS 13.5 Swift 5.1

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

Questões relacionadas

kwstasna picture kwstasna  ·  3Comentários

deepumukundan picture deepumukundan  ·  3Comentários

JW00332 picture JW00332  ·  4Comentários

valeIT picture valeIT  ·  3Comentários

brytnvmg picture brytnvmg  ·  4Comentários