Charts: (v3.0 + Swift3.0) ChartView HighlightValueWithX funktioniert nicht

Erstellt am 20. Sept. 2016  ·  23Kommentare  ·  Quelle: danielgindi/Charts

Die ChartView-Methode "lightValueWithX "scheint für v3.0 + Swift3.0 nicht mehr zu funktionieren
Xcode 8 / Hauptzweig / Objekt.

bug ★★★

Hilfreichster Kommentar

Ändern Sie diese Zeile: lineChartView.highlightValue (x: 3, dataSetIndex: 0)

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

Alle 23 Kommentare

@PhilJay highlightValue(x...) -Funktionen schlagen fehl , da der Highlight-Renderer erwartet, dass ein Y-Wert vorhanden ist. Das Ergebnis ist ein NaN, das dazu führt, dass es nirgendwo gerendert wird ...

Sowohl Android als auch iOS?

Ja...

Hmmm ... habe gerade den Code durchgesehen, das ist eine schwierige Frage. Für den Fall, dass wir mehrere Einträge an derselben x-Position haben, ist es nicht möglich, einen bestimmten Eintrag ohne Angabe der y-Position erfolgreich hervorzuheben.

Vielleicht sollten wir diese Methode fallen lassen?
Eine andere Möglichkeit wäre, die y-Position in die Methode aufzunehmen (als Parameter).

Nun, das Problem beginnt mit der Auswahl aus Berührungsereignissen - es funktioniert immer noch nicht wirklich, wenn Sie ein Streu- oder Blasendiagramm mit mehreren Werten auf demselben x haben. Es wählt tatsächlich das erste oder letzte auf demselben x aus - abhängig von der Position der Berührung auf der X-Achse!

Nachdem wir das behoben haben, wird der Algorithmus vermutlich einen Y-Wert annehmen und nach Erreichen des richtigen X nach dem richtigen Y suchen.
Und dann haben wir die Möglichkeit, einen Y-Wert als separate Methode zu übergeben! :-)
Das Original, einfach durch ein X hervorzuheben, ist sehr nützlich und viele, viele Leute hängen davon ab, gemessen an den Problemen ... Also werden wir Hass-Mails bekommen, wenn wir das entfernen :-)

Gibt es derzeit eine Möglichkeit, ein Liniendiagrammelement programmgesteuert hervorzuheben? Sind im Moment alle Highlight-Methoden kaputt?

@apurva Liniendiagramm sollte gut funktionieren. Ich habe ChartsDemo mit dem neuesten Mater-Zweig überprüft

Programmgesteuert markieren, funktioniert immer noch nicht in Liniendiagrammen.

Ich versuche den letzten Wert hervorzuheben:

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

Aber in der Delegatmethode - (void) chartValu eSelected: entry : Highlight: Highlight.xPx und Highlight.yPx sind NaN.

Ich kann erneut bestätigen, dass HighlightValueWithX nicht funktioniert.

Ich habe versucht, ein Highlight zu erstellen
ChartHighlight * high = [[ChartHighlight alloc]initWithX:(double)someInt dataSetIndex:0];
und verwendete die Methode "lightValueWithHighlight ", hebt sie jedoch immer noch nicht hervor. Die Methode chartValueSelected: entry: Highlight: delegate wird aufgerufen. Sie enthält die korrekten Werte im Eingabeobjekt, das Highlight-Objekt hat jedoch eine NaN im y-Wert.

Gibt es eine Möglichkeit, ein ChartHighlight * -Objekt zu erstellen, das auch den y-Wert enthält? Ich sehe verschiedene Init-Methoden für die ChartHighlight-Klasse, aber alle anderen benötigen absolute Pixelpositionen.

@ liuxuan30 Können Sie darauf hinweisen, welcher Teil der Diagrammdemo ein Diagramm programmgesteuert hervorhebt?

Gibt es alternativ eine Möglichkeit, den aktuell ausgewählten Eintrag in einem anderen Mechanismus als der Hervorhebung anzuzeigen?

Dies ist für TVOS unbedingt erforderlich, da Diagramme die Fokusumgebung nicht unterstützen und Benutzerinteraktionen im Diagramm programmgesteuert behandelt werden müssen, anstatt sich auf die integrierten Gestenerkenner zu verlassen.

Um dieses Problem zu umgehen, habe ich in meiner lokalen Kopie Folgendes getan:

Fügen Sie in Highlight.swift einen Initialisierer hinzu, der ebenfalls einen Wert annimmt:

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

Wenn ich dann programmgesteuert hervorheben möchte, mache ich es so:

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

Ich bin mit dem Code definitiv nicht vertraut genug, um zu wissen, ob dies ein anständiger Ansatz ist, um voranzukommen oder nicht. Wenn dies der Fall ist, denke ich, dass eine Sache, die helfen würde, ein ChartData.highlightForEntry() -> Highlight , das als Umkehrung zu ChartData.entryForHighlight()

Bei näherer Betrachtung stellte ich fest, dass einige der anderen Renderer, die nicht auf Liniendiagramme angewendet wurden, kürzlich korrigiert wurden.

In diesem Commit:

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

Die Variablen x und y wurden geändert, um von den Variablen entry , nicht vom Highlight h . Ich denke, wenn das gleiche Update auf LineChartRenderer angewendet würde, wäre das Problem behoben.

Ich werde das ausprobieren und hoffentlich eine PR dafür machen, wenn es die Zeit erlaubt.

Es sieht auch nicht so aus, als würde der y-Wert tatsächlich verwendet, da die Hervorhebungszeile nur von contentTop zu contentBottom wechselt. Die Wurzel des Problems ist tatsächlich die in dieser Zeile:

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

Wenn y NaN ist, wird pt.x auch als NaN ausgegeben. Dies scheint tatsächlich ein Swift 3 / CoreGraphics-Fehler zu sein, wie im Swift Repl hier gezeigt wird:

  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 kannst du meine fix-1495 Filiale hier ausprobieren:

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

Und sehen Sie, ob es für Sie wie erwartet funktioniert? Es funktioniert für mich. @danielgindi & @ liuxuan30 , ich habe den Code mehr oder weniger von ScatterChartRenderer kopiert, aber den if x > chartXMax * animator.phaseX Scheck hinzugefügt, den LineChartRenderer hatte.

Ich denke nicht, dass ich über set.entriesForXValue(high.x) iterieren muss, bin es aber derzeit. Ich glaube nicht, dass es schadet, da es nie mehr als einen Eintrag geben sollte, aber wenn Sie bestätigen können, dass dies der Fall ist, werde ich das gerne auf einen einzigen Anruf von set.entryForXValue(high.x) reduzieren und eine PR senden.

Es wäre auch schön, dem ChartsDemo eine programmatische Hervorhebungsoption hinzuzufügen, um beim Hervorheben von Hervorhebungsfehlern beim Regressionstest zu helfen, aber ich habe nicht untersucht, was dazu erforderlich ist.

Vielen Dank für Ihre Bemühungen @ryanschneider ! @ Danielgindi was denkst du?

@ryanschneider Danke für deine Bemühungen. Ich habe versucht, die Änderungen in Ihrem Zweig vorzunehmen, aber beide Methoden "HighlightValueWithX" und "HighlightValueWithHighlight" funktionieren bei mir immer noch nicht. Der y-Wert der Hervorhebung ist immer noch NaN und die Hervorhebung wird beim programmgesteuerten Aufruf nicht auf dem Diagramm gezeichnet.

@danielgindi Gerade mit dem neuesten Master getestet, einschließlich Ihres Commits unter https://github.com/danielgindi/Charts/commit/32a5952cae25f864c5fd3a449e4f413da7f36f9b

HighlightValueWithX zeigt die Hervorhebungslinien immer noch nicht an. Der Delegat wird gefeuert und der y-Wert der Hervorhebung ist im Delegaten immer noch NaN. Wie im vorherigen Fall werden beim Hervorheben über die Gestenerkenner die Hervorhebungslinien angezeigt, nur nicht, wenn HighlightValueWithX aufgerufen wird.

Funktioniert immer noch nicht.

Ich arbeite immer noch nicht für mich in Swift 3.

`Klasse 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)

    }

} `

Ändern Sie diese Zeile: lineChartView.highlightValue (x: 3, dataSetIndex: 0)

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

Ich habe versucht, ay: 0 in einem Liniendiagramm mit mehreren Datensätzen anzugeben, aber es funktioniert immer noch nicht. Gibt es ein Update dazu? Es ist ein ziemlich großer Fehler.

Ich rufe von Ziel C an.

Kleiner Hack, um die Position des hervorgehobenen Werts zu ermitteln

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

Ich habe Ihren Hack versucht, jndefosse, aber wie kann ich die Funktion aufrufen, um die Beschriftungen nur anzuzeigen, wenn der Eintrag markiert ist?

Ist dieser Fehler behoben? Ich kann anscheinend keinen Abschnitt in Kreisdiagrammen von iOS 13.5 Swift 5.1 hervorheben

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

Aungbandlab picture Aungbandlab  ·  4Kommentare

heumn picture heumn  ·  3Kommentare

newbiebie picture newbiebie  ·  3Kommentare

kwstasna picture kwstasna  ·  3Kommentare

brytnvmg picture brytnvmg  ·  4Kommentare