PieChart для ios-чартов сломан в Swift 2.0?
Поэтому я обновил свой проект и модули для работы с Swift 2.0 и Xcode 7. Но теперь мой PieChart больше не работает, как ожидалось. Все мои пироги начинаются с угла 0 градусов, что означает, что все они начинаются в одном и том же месте друг над другом.
Данные добавляются так же, как и раньше, и если я выделю их, я вижу, что они все есть, но не происходят из их соответствующих мест.
Код для добавления моего pieChartData
:
var dataEntries: [ChartDataEntry] = []
var dataPoints: [String] = []
for var i = 0; i < expensesHistory.count; i++ {
let dataEntry = ChartDataEntry(value: expensesHistory[i].amount, xIndex: i)
dataEntries.append(dataEntry)
dataPoints.append(expensesHistory[i].category.rawValue)
}
let pieChartDataSet = PieChartDataSet(yVals: dataEntries)
let pieChartData = PieChartData(xVals: dataPoints, dataSet: pieChartDataSet)
pieChartView.data = pieChartData
var colors = [UIColor]()
colors.append(Colors.blueColor())
pieChartDataSet.colors = colors
pieChartDataSet.drawValuesEnabled = false
pieChartDataSet.sliceSpace = 4.0
Данные загружаются и правильно добавляются в разные записи (их 7), но все 7 пирогов начинаются в одном и том же месте... поэтому они вообще не приводят к кругу. Есть идеи?
ОБНОВЛЕНИЕ № 1
Я перевел ChartsDemo на Swift, как мог, и в итоге столкнулся с той же проблемой, но дальнейшая отладка говорит мне, что я, вероятно, получаю только последнюю запись в DataSet. Если я установлю PieChartDataSet.drawValuesEnabled = true
а также PieChartView.legend.enabled = true
Я вижу только 1 значение в легенде и 1 значение для DataSet
, Но я проверил и мой xVals
а также yVals
содержат более 1 значения, но оно отображает только одно и произвольно выбранное, какое тоже. Я пытался найти шаблон, в котором он выбирает запись, но он выбирает один случайным образом.
Я добавил функциональность в мой PieChartView
что позволяет мне нажать кнопку, чтобы выделить запись, связанную с ней, поэтому я подумал, что все пироги расположены друг над другом, но теперь я думаю, что PieChartView
показывает только 1 значение, так как в отображаемой легенде я получаю только 1 значение, а не все из них друг над другом.
Вот мой код перевода из ChartsDemo в Swift, имейте в виду, что я использую Swift 2.0 (именно там этот вопрос впервые был представлен).
private func setPieChartData() {
let mult = UInt32(100)
let count = Int(4)
let parties = [
"Party A", "Party B", "Party C", "Party D", "Party E", "Party F",
"Party G", "Party H", "Party I", "Party J", "Party K", "Party L",
"Party M", "Party N", "Party O", "Party P", "Party Q", "Party R",
"Party S", "Party T", "Party U", "Party V", "Party W", "Party X",
"Party Y", "Party Z"
]
var yVals1 = [ChartDataEntry]()
// IMPORTANT: In a PieChart, no values (Entry) should have the same xIndex (even if from different DataSets), since no values can be drawn above each other.
for var i = 0; i < count; i++
{
let chartDataEntry = ChartDataEntry(value: Double((arc4random_uniform(mult) + mult/5)), xIndex: i)
yVals1.append(chartDataEntry)
}
var xVals = [String?]()
for var i = 0; i < count; i++
{
xVals.append(parties[i % parties.count])
//[xVals addObject:parties[i % parties.count]]
}
let dataSet = PieChartDataSet(yVals: yVals1, label: "Election Results")
dataSet.sliceSpace = 3.0
// add a lot of colors
var testColors = [UIColor]()
testColors.append(Colors.blueColor())
let data = PieChartData(xVals: xVals, dataSet: dataSet)
pieChartView.data = data
dataSet.colors = testColors
dataSet.drawValuesEnabled = true
dataSet.sliceSpace = 4.0
}
Поскольку эта проблема возникла, когда я обновился до версии ios-диаграмм, совместимой с Swift 2.0, я все еще думаю, что эта проблема связана с этим обновлением. Я не касался этого кода в течение нескольких месяцев до обновления, и он отлично работает с предыдущей версией. И насколько я могу судить с точки зрения отладки, все мои значения выдвигаются правильно, но, похоже, неправильно обрабатываются PieChartView
,
ОБНОВЛЕНИЕ № 2
Вот пример проекта, где я покажу вам проблему, которая у меня возникла. Я не включил функцию подсветки с помощью кнопок, так как для ее работы потребуется немного больше усилий. Ссылка на пример проекта
Как:
- Вам нужно Xcode 7, чтобы запустить это.
- Вам нужно установить CocoaPods.
- После того, как вы установили CocoaPods, используйте терминал, чтобы перейти в папку проекта, и наберите "pod install" в корне, чтобы установить платформу Charts.
- Используйте ChartsIssue.xcworkspace для запуска проекта, а не ChartsIssue.xcproj
1 ответ
Я попытался смоделировать, что делает ваш код в контроллере представления круговой диаграммы ChartsDemo, как показано ниже, но у него нет проблем.
Я посмотрел на ваш код, это тоже хорошо для меня. Я думаю, что может быть что-то не так с вашим значением данных, как тип класса? В любом случае, основываясь на текущей информации, я не могу сказать, что с ней не так, но кажется, что это проблема вашего проекта.
Есть два способа двигаться вперед:
1.Вы дважды проверьте значение данных и попробуйте отладку самостоятельно, чтобы выяснить, почему;
2. Попытайтесь воспроизвести с помощью кода ChartsDemo и опубликуйте ваш пример кода данных, чтобы я мог воспроизвести его на моей стороне; скриншот еще лучше.
- (void)setDataCount:(int)count range:(double)range
{
double mult = range;
NSMutableArray *yVals1 = [[NSMutableArray alloc] init];
// IMPORTANT: In a PieChart, no values (Entry) should have the same xIndex (even if from different DataSets), since no values can be drawn above each other.
for (int i = 0; i < count; i++)
{
[yVals1 addObject:[[ChartDataEntry alloc] initWithValue:(arc4random_uniform(mult) + mult / 5) xIndex:i]];
}
NSMutableArray *xVals = [[NSMutableArray alloc] init];
for (int i = 0; i < count; i++)
{
[xVals addObject:parties[i % parties.count]];
}
PieChartDataSet *dataSet = [[PieChartDataSet alloc] initWithYVals:yVals1 label:@"Election Results"];
dataSet.sliceSpace = 3.0;
// add a lot of colors
NSMutableArray *colors = [[NSMutableArray alloc] init];
[colors addObject:[UIColor blueColor]];
PieChartData *data = [[PieChartData alloc] initWithXVals:xVals dataSet:dataSet];
_chartView.data = data;
dataSet.colors = colors;
dataSet.drawValuesEnabled = NO;
dataSet.sliceSpace = 4.0;
}
Обновление для вопроса обновления 1 и 2:
Я скачал ваш демонстрационный проект и сумел заставить его работать на моей стороне, я вижу, что вы говорите, только одна полоса дуги, в то время как у вас должно быть 4 значения;
Я думаю, что вы столкнулись с ошибкой анимации или неправильно использовали ее:
pieChartView.animate(xAxisDuration: 1.5, easingOption: ChartEasingOption.EaseOutBack)
pieChartView.animate(yAxisDuration: 1.5, easingOption: ChartEasingOption.EaseOutBack)
Просто закомментируйте один из них, и он будет отображаться правильно (не уверен, что анимация в порядке), оба комментария будут отображаться правильно без анимации.
Если вы хотите анимировать оси x и y, используйте функцию func, приведенную ниже, чтобы получить правильную диаграмму и анимацию:
pieChartView.animate(xAxisDuration: 1.5, yAxisDuration: 1.5, easingOption: ChartEasingOption.EaseOutBack)
Я опубликую вопрос, чтобы спросить, допустимо ли использование отдельных методов одновременно или нет.