Charts: Balken werden während und nach dem Ziehen nicht gerendert oder verschwinden nicht

Erstellt am 13. März 2017  ·  30Kommentare  ·  Quelle: danielgindi/Charts

Ich habe ein Balkendiagramm mit BarChartView . In der Ansicht werden Arbeitsstunden pro Tag angezeigt.
Leider werden einige Balken überhaupt nicht gerendert - und andere verschwinden, während das gesamte Diagramm gezogen wird.

Bevor das Diagramm zum ersten Mal angezeigt wird, wird es gezoomt, um jeweils nur 7 Balken anzuzeigen:

barChart.zoom(scaleX:ceil(CGFloat(dataSet.xMax - dataSet.xMin) / 7), scaleY: 1, x: 0, y: 0)

Dann wird die Ansicht animiert, sodass zuerst der letzte Tag angezeigt wird:

barChart.moveViewToAnimated(xValue: dataSet.xMax, yValue: dataSet.yMin, axis: barChart.rightAxis.axisDependency, duration: 0.8, easingOption: .easeInOutSine)

Dies führt zu folgendem Ergebnis - so weit, so gut:

img_2071

Sobald ich das Diagramm nach rechts ziehe, verschwinden die Balken - nur der Wert bleibt sichtbar (beachten Sie den Balken von Mo. 6 - er ist weg):

img_2072

Auch alle Balken, die weiter links liegen und daher (wegen des Zooms) nicht sofort sichtbar sind, werden überhaupt nicht gerendert. Was mache ich falsch?

help wanted ★★

Hilfreichster Kommentar

Ich habe das gleiche Problem mit 3.0.2 in einem CombinedChartView mit gestapeltem Balken BarChartData() .
Beim Zoomen und Ziehen der am weitesten rechts stehenden Dateneingabe außerhalb der sichtbaren Ansicht verschwinden die Balken, die Datenbeschriftungen sind vorhanden. Außerdem beschränke ich .setVisibleXRangeMaximum() und bewege die linke Seite überhaupt nicht über .moveViewToX() .

Ein anderes seltsames Verhalten ist, dass ich nicht alle Balken über .highlightPerTapEnabled() auswählen kann, sondern nur die mittlere Leiste in einem Satz von z. B. 13 auswählbar ist. Ich bin mir nicht sicher, ob dies überhaupt damit zusammenhängt.

gelöst: Das Problem war, dass die Dateneingaben in umgekehrter Reihenfolge waren. Das Ordnen der Dateneingaben durch Erhöhen der x-Werte löste das Problem.

Alle 30 Kommentare

Sie müssen zuerst auf Ihrer Seite debuggen.
Schauen Sie sich fileprivate func prepareBuffer(dataSet: IBarChartDataSet, index: Int) , wo der barRect berechnet wird.
Bitte debuggen Sie vor und nach dem Zoomen, was das fehlende barRect verursachen könnte.
Angesichts der Tatsache, dass einige der Balken noch vorhanden sind und die Beschriftungspositionen korrekt erscheinen, könnte dies ein einfacher Fehler der Bibliothek oder von Ihnen sein.

Es wäre einfacher, wenn Sie es mit ChartsDemo reproduzieren könnten

Ich konnte einen Testfall für das Problem erstellen. Leider kann ich nicht herausfinden, was es tatsächlich verursacht.

Um den Testfall auszuführen, verwenden Sie das Ziel ChartsDemo im Simulator iPhone 6 (10.2) von Xcode 8.2.1 . Ziehen Sie dann das Diagramm nach rechts. Der grüne Balken von Tue 7th verschwindet.

Bemerkenswert: Der Code des Testfalls basiert auf dieser Pull-Anfrage für zugeordnete Diagrammbezeichnungen . Die Pull-Anforderung bietet die Funktionalität, die Tage auf der xAxis zu rendern, wie Sie auf den Screenshots sehen werden. Ich kann jedoch nicht erkennen, warum diese Pull-Anforderung das Problem verursachen sollte.

Ich habe kurz überprüft, ob die fehlenden Balken die Pausenbedingung erfüllen:

            if (!viewPortHandler.isInBoundsLeft(barRect.origin.x + barRect.size.width))
            {
                continue
            }

            if (!viewPortHandler.isInBoundsRight(barRect.origin.x))
            {
                break
            }

Ich kann jedoch nicht erklären, was die Ursache ist. Das barRect 'scheinen' berechnet richtig

Vielen Dank für deine Unterstützung; Ich weiß das wirklich zu schätzen!

Ich dachte noch einmal darüber nach, ob die Pull-Anfrage das Problem verursachen könnte. Was sich definitiv geändert hat, ist die Art und Weise, wie die Achsenbeschriftungen gezeichnet werden. Dies wirkt sich möglicherweise auf die Breite des Achsenelements aus, was sich am Ende auch auf barRect auswirkt.

Wie können wir eingrenzen, wenn das Problem auf a) einen Fehler in der Pull-Anforderung, b) einen Fehler in der Diagrammbibliothek oder c) einfach auf eine falsche Verwendung zurückzuführen ist?

Als ich das letzte Mal nachgesehen habe, habe ich versucht, die Bibliothek durch Master zu ersetzen. Es scheint immer noch fehlerhaft zu sein. Sie können ersetzen und helfen, zu überprüfen.

viewPortHandler.isInBoundsRight sollte wohl nicht beeinflusst werden, solange der Feature-Zweig die barRect-Berechnung nicht ändert.

Im Moment kann ich nicht sagen, dass Sie es falsch verwendet haben, es ist genau wie bei den Problemen contentRect und bar rect edge.

Es tut mir leid, dass ich nicht viel Zeit habe, in die rechten Kanten zu schauen, um herauszufinden, was los ist. Sie können jedoch ChartsDemo ausprobieren, um ähnliche Aktionen auszuführen, um festzustellen, ob Sie reproduzieren können.

@ Danielgindi eine Idee?

Gibt es Neuigkeiten bezüglich der Pull-Anfrage oder dieses Problems?

Etwas? Wie kann ich helfen, dies zu beheben?

@marbetschar Ich erinnere

Ich habe jedoch keine Zeit, mir die Matrix anzuschauen.

Ich denke, das Hauptproblem hier ist, warum es über die Bedingung hinausgeht. Ich sehe kein offensichtliches Problem bei der Berechnung des Balkenrektors.

Wenn Sie Zeit haben, können Sie sich die barRect-Berechnung ansehen.

Genauer gesagt: Wenn der Balken fehlt, bleibt die Beschriftung darüber immer noch an der richtigen Position, also handelt es sich nur um die Probleme mit der barRect-Kante.

Sie können versuchen, zu entfernen

            if (!viewPortHandler.isInBoundsLeft(barRect.origin.x + barRect.size.width))
            {
                continue
            }

            if (!viewPortHandler.isInBoundsRight(barRect.origin.x))
            {
                break
            }

Und prüfen Sie, ob sich die Leiste an der richtigen Position und in der richtigen Größe befindet, damit wir entscheiden können, ob es nur um die Randprobleme geht.

@marbetschar Ich habe genau das gleiche Problem.

@ Jeffalee Leider hatte ich noch keine Zeit, mich mit diesem Thema zu

@marbetschar @jeffalee hängt dieses Problem mit dem viewPortHandler zusammen?

Ich habe das gleiche Problem mit 3.0.2, oder wahrscheinlich scheint es das gleiche Problem zu sein. Würde mich über Hilfe freuen.

self.chartView.data = getChartData() // .count == 25
self.chartView.setVisibleXRangeMaximum(10) 
self.chartView.moveViewToX(20)

Nur die letzten 10 Datenleisten werden gerendert / angezeigt, wenn ich nach links und rechts scrolle.

  • Wenn der letzte Balken außerhalb der Grenzen liegt, wird der Balkenwert ausgeblendet und
  • Wenn der letzte außerhalb der Grenzen liegt, sind alle gezeichneten Balken verschwunden.
  • Das xAxis-Label blieb erhalten

Wenn ich die letzten 2 Zeilen entferne, wird das Diagramm ordnungsgemäß gerendert.

@perwyl Ich habe genau die gleichen zwei Zeilen in meinem Code; Ich würde also behaupten, dass Sie auf dasselbe Problem gestoßen sind. @ liuxuan30 hat ein bisschen viewPortHandler .

Leider habe ich momentan keine Zeit, mich damit zu beschäftigen. Wäre dankbar, wenn Sie es versuchen.

@ Marbetschar in Ordnung. Danke für die Bestätigung.

Ich habe das gleiche Problem mit 3.0.2 in einem CombinedChartView mit gestapeltem Balken BarChartData() .
Beim Zoomen und Ziehen der am weitesten rechts stehenden Dateneingabe außerhalb der sichtbaren Ansicht verschwinden die Balken, die Datenbeschriftungen sind vorhanden. Außerdem beschränke ich .setVisibleXRangeMaximum() und bewege die linke Seite überhaupt nicht über .moveViewToX() .

Ein anderes seltsames Verhalten ist, dass ich nicht alle Balken über .highlightPerTapEnabled() auswählen kann, sondern nur die mittlere Leiste in einem Satz von z. B. 13 auswählbar ist. Ich bin mir nicht sicher, ob dies überhaupt damit zusammenhängt.

gelöst: Das Problem war, dass die Dateneingaben in umgekehrter Reihenfolge waren. Das Ordnen der Dateneingaben durch Erhöhen der x-Werte löste das Problem.

@kscheff welches Problem hast du als gelöst bezeichnet? Nur deine oder auch @marbetschar ?

@ liuxuan30 Ich konnte @marbetschar sein Problem nicht verifizieren. Ich habe nur gesehen, dass ich ein ähnliches Problem mit fehlenden Balken habe, das ich durch Sortieren der Werte beheben konnte. Deshalb schlage ich @marbetschar vor , seine Einträge im Datensatz zu sortieren.

Danke, verstanden

@kscheff wie ?

 Another strange behavior is that I cannot select all bars via .highlightPerTapEnabled(), only the center bar in a set of e.g. 13 is selectable. Not sure if this is related at all.

@perwyl dieses Problem verschwand auch mit der Sortierung.

@kscheff danke! Ich muss tatsächlich return yVals.reversed() tun, nicht sicher, was die Logik dahinter ist.

Das ist großartig, wenn Sie bei der Bestellung von Daten Diagramme beim Zoomen richtig zeichnen. Könnte die Sortieraktion standardmäßig in der Methode "notifyDataSetChanged" oder möglicherweise an einer anderen Stelle im Pod enthalten sein? Soll ich PR machen?

Bitte machen Sie eine PR mit Details wie dem Problem und der Grundursache usw. Dies war eine ziemliche Zeit und Gespräche, nicht sicher, ob es sich um dasselbe Problem mit diesem Beitrag handelt.

Ich denke, wenn wir dies tun (und ich denke, wir sollten es tun), sollte der einzige Weg, Daten hinzuzufügen, in einer geordneten Weise sein.

Sortieren oder dieses Problem? Früher kümmerte sich der Benutzer, an den ich mich erinnere, um das Sortieren.

Sortieren oder dieses Problem? Früher kümmerte sich der Benutzer, an den ich mich erinnere, um das Sortieren.

Wie ich sehe, führt dies zu einer falschen Darstellung der Daten im Diagramm. Es scheint also nicht offensichtlich, Daten sortiert vorzubereiten (es hat einen x-Wert - daher ist die notwendige und ausreichende Bedingung definiert, um richtig zu zeichnen). Vielleicht sollte der Pod autark sein und keine nicht offensichtlichen Anforderungen stellen? meiner bescheidenen Meinung nach
Ich werde in ein paar Tagen PR vorbereiten, hoffe, diese Logik ist offensichtlich.

Obwohl ich nur mit einem Balkendiagramm arbeite. Möglicherweise könnte eine Art von Diagrammen betroffen sein. Aber ich verstehe wirklich nicht, wie es zuerst richtig gezeichnet werden kann und habe Probleme beim Zeichnen eines gezoomten Teils des Diagramms aus der logischen Perspektive.

@ liuxuan30 Mein Verständnis ist, dass dieses Problem darauf zurückzuführen ist, dass die Daten unsortiert sind. Vermisse ich etwas

Ich vermute hier, aber wenn Daten immer sortiert sind, können wir wahrscheinlich auch Annahmen beim Rendern treffen, um die Leistung zu verbessern.

Ehrlich gesagt erinnere ich mich nicht. Das letzte Mal, als ich nachgesehen habe, habe ich gefunden

if (!viewPortHandler.isInBoundsLeft(barRect.origin.x + barRect.size.width))
            {
                continue
            }

            if (!viewPortHandler.isInBoundsRight(barRect.origin.x))
            {
                break
            }

Eine der beiden Bedingungen ist nicht erfüllt, sodass die Balken nicht gerendert werden. @marbetschar wurde seitdem nicht aktualisiert, daher bin ich mir nicht sicher, ob die Hauptursache des ursprünglichen Problems mit dem Sortieren zusammenhängt, wie es @kscheff angeboten hat.

Hallo Leute! Gibt es Neuigkeiten zu diesem Thema? Verwenden Sie Version 3.3.0 und immer noch das gleiche Problem mit BarChartView. Irgendwelche Ideen, wie man das Problem beheben kann, wenn es wichtig ist, yAxis-Werte nicht zu sortieren?

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen