2017-01-04 3 views
1

У меня есть диаграмма пончиков с использованием Shinobi. Но в зависимости от данных метки перекрываются !!Наклейки с надписью Shinobi Donut

enter image description here

Также одна из меток не показали полностью (Max Оплата).

Я искал все переполнение стека и не нашел для этого решения. Также нет ничего об этом на веб-сайте 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

Я считаю, что вам нужен метод sChart:alterLabel:forDatapoint:atSliceIndex:inRadialSeries:NS_SWIFT_NAME: протокола SChartDelegate.

Согласно 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).


Серия пончиков не делает ничего, чтобы предотвратить совпадение ярлыков на спицах. Если вы хотите отображать спицы для точек данных, которые являются небольшими пропорциями серии пончиков, вам нужно будет создать свою собственную реализацию, которая, к сожалению, прекратит совпадение. Я обязательно скажу об этом команде, и мы рассмотрим возможность добавления этой функции в будущую версию.

Альтернативное решение, возможно, заключается в том, чтобы скрыть спицы, которые соответствуют небольшим значениям, так что они перекрываются с соседними значениями. Вы можете сделать это на основе среза по методу SChartDonutSeriessetSpokeStyle:forSpokeAtSliceIndex:. Я понимаю, что это не идеальное решение.


Просто на будущее, было бы здорово, если бы вы могли бы спросить в будущем Shinobi связанные вопросы на нашем forum - это делает его немного легче гарантировать, что мы ответим на ваши вопросы как можно быстрее, и увидеть любые последующие которые могут возникнуть.

+0

«Серия пончиков не делает ничего, чтобы предотвратить совпадение ярлыков на спицах». Это слишком плохо ... Я закончил создание легенд и не использовал ярлыки на спицах ... – Besat

Смежные вопросы