2017-01-04 3 views
1

Ich habe ein Diagramm Donut mit Shinobi. Aber abhängig von den Daten überschneiden sich die Etiketten !!Shinobi Donut Chart-Etiketten überlappen

enter image description here

Auch einer der Etiketten wird nicht vollständig (Max Payment) zeigte.

Ich habe überall auf dem Stack-Überlauf gesucht und keine Lösung dafür gefunden. Auch nichts über dieses Problem in Shinobi Website oder in ihren Dokumentationen.

dies ist mein Code:

import UIKit 

class MyViewController: UIViewController, SChartDatasource { 
    var donutChartValues:[Double] = [] 
    var donutChartLabels:[String] = [] 
    @IBOutlet weak var chartView: UIView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     redrawChart() 
    } 

    func redrawChart() { 
     setDonutChartValues() 
     let chart = ShinobiChart(frame: chartView.bounds) 
     chart.autoresizingMask = [.flexibleHeight, .flexibleWidth] 
     chart.backgroundColor = UIColor.clear 
     chart.datasource = self 
     chartView.addSubview(chart) 
    } 
    func setDonutChartValues() { 
     donutChartValues.removeAll() 
     donutChartLabels.removeAll() 
     donutChartValues.append(2500.00) 
     donutChartLabels.append("Max Payment") 
     donutChartValues.append(300.0) 
     donutChartLabels.append("Property Tax") 
     donutChartValues.append(100.0) 
     donutChartLabels.append("Condo Fees") 
     donutChartValues.append(150.0) 
     donutChartLabels.append("Heating Costs") 
     donutChartValues.append(300.0) 
     donutChartLabels.append("Debts") 
     donutChartValues.append(4000.0) 
     donutChartLabels.append("Other Expenses") 
    } 

    /********************************************************************************/ 
    // MARK: - SChartDatasource methods 
    /********************************************************************************/ 

    func numberOfSeries(in chart: ShinobiChart) -> Int { 
     return 1 
    } 

    func sChart(_ chart: ShinobiChart, seriesAt index: Int) -> SChartSeries { 
     let donutSeries = SChartDonutSeries() 
     donutSeries.style().spokeStyle.showSpokes = true; 
     donutSeries.selectedStyle().spokeStyle.showSpokes = true; 
     donutSeries.style().labelFontColor = UIColor.black 
     donutSeries.selectedStyle().labelFontColor = UIColor.black 
     return donutSeries 
    } 

    func sChart(_ chart: ShinobiChart, numberOfDataPointsForSeriesAt seriesIndex: Int) -> Int { 
     return donutChartValues.count 
    } 

    func sChart(_ chart: ShinobiChart, dataPointAt dataIndex: Int, forSeriesAt seriesIndex: Int) -> SChartData { 
     let dp = SChartDataPoint() 
     dp.xValue = 0 
     dp.yValue = (donutChartValues.count > dataIndex) ? donutChartValues[dataIndex] : 0 
     return dp 
    } 

    func sChart(_ chart: ShinobiChart, labelForSliceAt sliceIndex: Int, in series: SChartRadialSeries) -> UILabel? { 
     let sliceLabel = UILabel() 
     sliceLabel.text = (donutChartLabels.count > sliceIndex) ? donutChartLabels[sliceIndex] : "" 
     return sliceLabel 
    } 
} 

Jede Hilfe würde geschätzt.

Antwort

0

glaube ich, was Sie wollen, ist die sChart:alterLabel:forDatapoint:atSliceIndex:inRadialSeries:NS_SWIFT_NAME: Methode des SChartDelegate Protokoll.

Nach the documentation für diese Methode, es „gibt Ihnen jedes Etikett für jede Serie pie/Krapfen, bevor es auf die Tabelle hinzugefügt wird. Verwenden Sie diese Option Farben, Grenzen zu setzen, oder reposition das Etikett.“ (Betonung hinzugefügt).

Diese blog article gibt ein Beispiel dafür, wie es zu implementieren.

+0

Danke, aber die Daten würden sich im Programm ändern, ich glaube nicht, dass es einen einfachen Weg für mich geben würde zu berechnen, ob sich die Labels auf neuen Daten überlappen würden oder nicht. – Besat

0

Wie Mike Traverse vorschlägt, ist die empfohlene Methode zum Anpassen des in den Beschriftungen angezeigten Texts die Delegate-Methode sChart:alterLabel:forDataPoint:.... Dies verhindert, dass Sie davon ab, die Etiketten selbst zu erstellen und Sie können die Beschriftung der Text stattdessen einfach stellen Sie den Wert Sie anzeigen möchten, zB:

func sChart(_ chart: ShinobiChart, 
       alter label: UILabel, 
       for datapoint: SChartRadialDataPoint, 
       atSlice index: Int, 
       in series: SChartRadialSeries) { 
    label.text = datapoint.name 
} 

Sie müssen Ihr Diagramm des Delegierten vergeben und dann die Daten leicht ändern Quelle Methode, wo Sie die Datenpunkte zurück:

func sChart(_ chart: ShinobiChart, dataPointAt dataIndex: Int, forSeriesAt seriesIndex: Int) -> SChartData { 
     let dp = SChartDataPoint() 
     dp.xValue = donutChartLabels[dataIndex] 
     dp.yValue = (donutChartValues.count > dataIndex) ? donutChartValues[dataIndex] : 0 
     return dp 
} 

die Serie alle Etiketten innerhalb der Grenzen des Diagramms halten sollte, und ich habe Angst, daß ich das Problem nicht replizieren können Sie sehen, wo Ihre Zahlung Etikett wird abgeschnitten. Sind Sie sicher, dass die Diagrammansicht nicht über die Grenzen des Bildschirms hinausgeht? (Eine gute Möglichkeit, dies zu überprüfen, ist die Verwendung von View Debugging Werkzeug).


Die Donut-Serie machen keine Sache die Speichen Etiketten zu verhindern, dass überlappen. Wenn Sie Speichen für Datenpunkte anzeigen möchten, die kleine Proportionen der Donut-Serie sind, müssen Sie eine eigene Implementierung erstellen, die das Überschneiden leider verhindert. Ich werde das dem Team sicherlich mitteilen und wir werden darüber nachdenken, diese Funktionalität in einer zukünftigen Version hinzuzufügen.

Eine alternative Lösung wäre vielleicht die Speichen zu verbergen, die auf kleine Werte entsprechen, so dass sie mit benachbarten Werten überlappen. Sie können dies auf einer Scheibe-für-Schicht-Basis unter Verwendung der SChartDonutSeries Methode setSpokeStyle:forSpokeAtSliceIndex:. Ich weiß, dass es keine perfekte Lösung ist.


nur für die Zukunft, wäre es toll, wenn Sie künftig Shinobi bezogene Fragen stellen können auf unserem forum - es macht es ein wenig einfacher, damit wir Ihre Fragen so schnell wie möglich beantworten und sieht jede folgen Sie können Fragen haben.

+0

"Die Donut-Serie macht nichts, um zu verhindern, dass sich die Speichetiketten überschneiden." Das ist schade ... Ich habe die Legenden selbst kreiert und verwende nicht die Speichenetiketten ... – Besat