Charts: (v3.0 + Swift3.0) ChartView highlightValueWithX no funciona

Creado en 20 sept. 2016  ·  23Comentarios  ·  Fuente: danielgindi/Charts

El método ChartView highlightValueWithX parece dejar de funcionar para v3.0 + Swift3.0
Xcode 8 / Rama maestra / Objc.

bug ★★★

Comentario más útil

Cambie esta línea: lineChartView.highlightValue (x: 3, dataSetIndex: 0)

to: lineChartView.highlightValue (Resaltar (x: 3, y: 0, dataSetIndex: 0)

Todos 23 comentarios

Las funciones highlightValue(x...) @PhilJay highlightValue(x...) están fallando, porque el renderizador de resaltado espera que esté presente un valor Y. El resultado es un NaN, lo que hace que no se muestre en ninguna parte ...

¿Tanto Android como iOS?

Si...

Hmmm ... acabo de mirar el código, este es complicado. En el caso de que tengamos varias entradas en la misma posición x, no será posible resaltar con éxito una determinada entrada sin especificar la posición y.

Entonces, ¿quizás deberíamos dejar este método?
¿Otra opción sería incluir la posición y en el método (como parámetro)?

Bueno, el problema comienza con la selección de eventos táctiles; todavía no funciona realmente, si tiene gráficos de dispersión o de burbujas con múltiples valores en la misma x. De hecho, selecciona el primero o el último en la misma x, ¡dependiendo de la posición del toque en el eje X!

Después de que arreglemos eso, supongo que nuestro algoritmo sabrá tomar un valor de Y y después de alcanzar la X correcta comenzará a buscar la Y correcta.
¡Y luego tendremos la opción de pasar un valor Y, como un método separado! :-)
El original, para resaltar simplemente con una X, es muy útil y mucha gente depende de él, a juzgar por los problemas ... Así que recibiremos mensajes de odio si lo eliminamos :-)

¿Existe alguna solución actual para resaltar programáticamente un elemento de gráfico de líneas? ¿Están todos los métodos de resaltado rotos en este momento?

El gráfico de líneas de

El resaltado programático aún no funciona en gráficos de líneas.

Intento resaltar el último valor:

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

Pero en el método delegado - (void) chartValu eSelected: entrada : resaltar: resaltar.xPx y resaltar.yPx son NaN.

Puedo volver a confirmar que highlightValueWithX no está funcionando.

Intenté crear un punto culminante
ChartHighlight * high = [[ChartHighlight alloc]initWithX:(double)someInt dataSetIndex:0];
y usó el método highlightValueWithHighlight con él pero aún no resalta. Se llama al método chartValueSelected: entry: highlight: delegate, que contiene los valores correctos en el objeto de entrada, pero el objeto resaltado tiene un NaN en el valor y.

¿Hay alguna forma de crear un objeto ChartHighlight * que también contenga el valor y? Veo varios métodos de inicio para la clase ChartHighlight, pero todos los demás necesitan posiciones absolutas de píxeles.

@ liuxuan30 ¿Puede señalar qué parte de la demostración de gráficos destaca un gráfico mediante programación?

Alternativamente, ¿hay alguna forma de mostrar la entrada actualmente seleccionada en cualquier otro mecanismo además de usar el resaltado?

Esto es absolutamente esencial para TVOS, ya que los gráficos no son compatibles con el entorno de enfoque, y las interacciones del usuario en el gráfico deben manejarse mediante programación en lugar de depender de los reconocedores de gestos integrados.

Para solucionar este problema, hice lo siguiente en mi copia local:

En Highlight.swift, agregue un inicializador que también tome un valor ay:

    /// - 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
    }

Luego, cuando quiero resaltar programáticamente, lo hago así:

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

Definitivamente no estoy lo suficientemente familiarizado con el código para saber si este es un enfoque decente para seguir adelante o no. Si es así, creo que una cosa que ayudaría es que ChartData.highlightForEntry() -> Highlight actúe como inverso a ChartData.entryForHighlight()

En realidad, mirando más de cerca, descubrí que había correcciones recientes en algunos de los otros renderizadores que no se aplicaron a los gráficos de líneas.

En este compromiso:

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

Las variables x y y se cambiaron para que provengan de entry , no del Highlight h . Creo que si esta misma solución se aplicara a LineChartRenderer el problema se solucionaría.

Lo intentaré y, con suerte, conseguiré un RP listo hoy si el tiempo lo permite.

Además, no parece que el valor y se use realmente, ya que la línea resaltada solo va de contentTop a contentBottom. La raíz del problema es en realidad que en esta línea:

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

Si y es NaN , pt.x también aparece como NaN . Esto en realidad parece ser un error de Swift 3 / CoreGraphics, como se evidencia en Swift Repl aquí:

  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, ¿puedes probar mi rama fix-1495 aquí?

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

¿Y ver si funciona como se esperaba para usted? Me está funcionando. @danielgindi y @ liuxuan30, yo más o menos copiado el código de ScatterChartRenderer pero agregó que el if x > chartXMax * animator.phaseX cheque que LineChartRenderer tenían.

No creo que deba iterar sobre set.entriesForXValue(high.x) pero actualmente lo estoy. No creo que haya ningún daño ya que nunca debería haber más de una entrada, pero si puedes confirmar que ese es el caso, felizmente colapsaré eso en una sola llamada set.entryForXValue(high.x) y enviaré un PR.

También sería bueno agregar una opción de resaltado programático a ChartsDemo para ayudar en las pruebas de regresión resaltar errores, pero no he investigado qué se necesitaría para hacer eso.

¡Gracias por tus esfuerzos @ryanschneider ! @danielgindi ¿qué piensas?

@ryanschneider Gracias por sus esfuerzos. Probé los cambios en su rama, pero los métodos highlightValueWithX y highlightValueWithHighlight todavía no funcionan para mí. El valor y del resaltado sigue siendo NaN y el resaltado no se dibuja en el gráfico cuando se llama mediante programación.

@danielgindi Acabo de probar con el último maestro, incluida su confirmación en https://github.com/danielgindi/Charts/commit/32a5952cae25f864c5fd3a449e4f413da7f36f9b

highlightValueWithX todavía no muestra las líneas resaltadas. El delegado es despedido y el valor y del resaltado sigue siendo NaN en el delegado. Como en el caso anterior, el resaltado a través de los reconocedores de gestos muestra las líneas resaltadas, pero no cuando se llama a highlightValueWithX.

Todavía no funciona.

Todavía no me funciona en 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)

    }

} `

Cambie esta línea: lineChartView.highlightValue (x: 3, dataSetIndex: 0)

to: lineChartView.highlightValue (Resaltar (x: 3, y: 0, dataSetIndex: 0)

Intenté especificar ay: 0 en un gráfico de líneas con varios conjuntos de datos y todavía no funciona. ¿Hay alguna actualización sobre esto? Es un error bastante grande.

Llamo desde Objective C.

Pequeño truco para obtener la posición del valor resaltado

// 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
        }
}

Probé su truco, jndefosse, pero ¿cómo puedo llamar a la función para mostrar las etiquetas solo cuando la entrada está resaltada?

¿Se corrigió este error? Parece que no puedo resaltar una sección en los gráficos circulares de iOS 13.5 Swift 5.1

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

ahmedsafadii picture ahmedsafadii  ·  3Comentarios

cilasgimenez picture cilasgimenez  ·  4Comentarios

guoyutaog picture guoyutaog  ·  3Comentarios

JW00332 picture JW00332  ·  4Comentarios

Bharati555 picture Bharati555  ·  4Comentarios