2017-01-04 10 views
1

Shinobi를 사용하는 도넛 차트가 있습니다. 그러나 데이터에 따라 라벨이 겹칩니다.Shinobi 도넛 차트 레이블이 겹침

enter image description here

또한 레이블 중 하나가 완전히 (최대 지불을) 보여되지 않습니다.

스택 오버플로 전체를 검색하여 이에 대한 해결책을 찾을 수 없습니다. 또한 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

마이크 트래버스 (Mike Traverse)가 제안했듯이 레이블에 표시되는 텍스트를 조정하는 가장 좋은 방법은 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:을 사용하여 슬라이스 단위로이 작업을 수행 할 수 있습니다. 그러나 나는 완벽한 솔루션이 아니므로 고맙습니다. 당신이 미래에 Shinobi을 관련 질문을 할 수 있다면


그냥 나중에 참조 할 수 있도록, 그것은 좋은 것 우리 forum - 그것이 좀 더 쉽게 우리가 가능한 한 빨리 귀하의 질문에 대한 답변을 확인하고 따를 볼 수 있습니다 질문이있을 수 있습니다.

+0

"도넛 형 시리즈는 스포크 레이블이 겹치지 않도록하지 않습니다."너무 나쁘다 ... 나는 전설을 스스로 만들었고 스포크 라벨을 사용하지 않았다 ... – Besat