2017-01-04 28 views
1

忍を使ったドーナツチャートがあります。しかし、データによってはラベルが重なり合ってしまいます。またShinobiドーナツチャートのラベルが重なっています

enter image description here

ラベルの1つが完全に(最大支払い)を示していません。

スタックのオーバーフローをすべて検索しましたが、解決策が見つかりませんでした。また、この問題については、Shinobiのウェブサイトまたはそのドキュメンテーションでは何もしていません。

これは私のコードです:

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

任意の助けをいただければ幸いです。

答えて

0

SChartDelegateプロトコルのsChart:alterLabel:forDatapoint:atSliceIndex:inRadialSeries:NS_SWIFT_NAME: メソッドが必要です。この方法のためのthe documentationによると、それは「それがチャートに追加される前に、あなたは、各円グラフ/ドーナツシリーズの各ラベルを提供します。色を設定するために使用し、ボーダー、またはラベルを再配置します。」

(強調が加えられた)。

このblog articleは、その実装方法の例を示しています。

+0

ありがとうございますが、データがプログラム内で変更されるため、新しいデータに基づくラベルが重複するかどうかを簡単に計算することはできません。 – Besat

0

マイクトラバースが示唆するように、ラベルに表示されるテキストを調整するには、sChart:alterLabel:forDataPoint:...デリゲートメソッドを使用することをお勧めします。これは、あなたがラベルを自分で作成することから防ぎ、あなたの代わりに、単純に例えば、あなたが希望する値を表示するラベルのテキストを調整することができます。

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

をあなたは、チャートのデリゲートを割り当て、少しのデータを変更する必要がありますあなたがデータポイントを返すソース方法:

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 
} 

シリーズは、グラフの境界内にすべてのラベルを維持しなければならないと私はあなたがあなたの支払見ている問題を複製することはできません怖いですラベルがクリップされています。チャートビューが画面の境界を越えて拡大していないことを確かめていますか? (これをチェックする良い方法は、View Debuggingツールを使用することです)。


スポークラベルが重ならないようにするために、ドーナツシリーズは何もしません。あなたがドーナツシリーズの小さな割合であるデータポイントのスポークを表示したい場合は、残念ながらオーバーラップが発生しないように独自の実装を作成する必要があります。私は確かにこれをチームに言及し、将来のリリースでこの機能を追加することを検討します。

代わりの解決策は、小さな値に対応するスポークを隣接値と重なるように隠すことです。これは、SChartDonutSeriesの方法setSpokeStyle:forSpokeAtSliceIndex:を使用してスライス単位で行うことができます。しかし、それは完璧な解決策ではないことを感謝します。あなたが私たちのforumに関する将来忍関連の質問をすることができれば


ただ、今後の参考のために、それは素晴らしいことだろう - それは、我々は可能な限り迅速にご質問にお答えし、任意のフォローを見確保するために、それは少し簡単になりますあなたが持っている可能性のある質問。

+0

「ドーナツシリーズは、スポークラベルが重なってしまうのを防ぐために何もしません」それはあまりにも悪い...私は自分自身で伝説を作ってスポークラベルを使わないで終わった。 – Besat

関連する問題