用于在Swift 2.0中打破的ios-charts的PieChart?

时间:2015-10-06 12:44:06

标签: swift ios-charts

所以我升级了我的项目和pods,使用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 = truePieChartView.legend.enabled = true,我只会看到图例中的1个值和DataSet的1个值。但我检查过,xValsyVals包含的值超过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
}

由于此问题在我更新到兼容Swos 2.0的ios-charts版本时开始,我仍然认为此问题与该更新有关。我在更新之前的几个月内没有触及过这段代码,而且它与以前的版本一起工作正常。从调试的角度来看,我可以正确地推送所有值,但似乎PieChartView无法正确处理。

更新#2

这是一个示例项目,我向您展示了我遇到的问题。我没有包含使用按钮突出显示的功能,因为它需要更多努力才能使其正常工作。 Link to sample project

如何:

  1. 你需要Xcode 7来运行它。
  2. 您需要安装CocoaPod。
  3. 安装CocoaPods后,使用终端转到项目文件夹并输入&#34; pod install&#34;在root中安装Charts框架。
  4. 使用ChartsIssue.xcworkspace启动项目,而不是ChartsIssue.xcproj

1 个答案:

答案 0 :(得分: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&amp; 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)

我会发布一个issue来询问同时使用不同的方法是否有效。