任何人都可以弄清楚如何手动触发此饼图的动画(XYPieChart)?

时间:2014-02-28 13:38:21

标签: ios core-animation

任何人都可以查看XYPieChart文件,看看是否有办法手动触发动画。我已经尝试reloadData,但是没有尝试。

您可以从github获取演示并添加一个按钮并尝试各种方法来关闭动画。正如我所说[self.pieChartLeft reloadData]不会这样做。

1 个答案:

答案 0 :(得分:2)

据我所知,你正在寻找填满图表的动画。

要实现这一目标,首先必须删除所有元素,然后{strong>继续reloadData,然后等待动画完成,然后再次添加所有元素并reloadData试。

因此,要在演示中显示它,我刚刚将clearSlices文件中的ViewController.m方法修改为:

- (IBAction)clearSlices {
    [_slices removeAllObjects];
    [self.pieChartLeft reloadData];
    [self.pieChartRight reloadData];

    double delayInSeconds = 1.0;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
        for (int i = 0; i < 4; i++)
            [_slices addObject:@(rand()%60+20)];
       [self updateSlices];
    });
}

延迟当然必须等于动画长度。试一试,看看那是不是你想要的,否则发表评论,我会找到解决方法。

我还认为XYPieChart有点乱,可以改进 - 应该有手动动画图表的方法(就像你想做的那样)。也许我会做一个分叉:)

修改
如果您不想通过添加实例布尔变量来完全删除数据,那么您可以调整一下您的代码,让我们说BOOL _showAnimationOnly或者您喜欢的任何内容。然后在委托方法pieChart:valueForSliceAtIndex:中,如果此布尔值为YES,则只提供0。你必须控制那个变量,在不同的地方设置它(取决于你的代码)。像这样:

- (IBAction)animateSlices {
    _showAnimationOnly = YES;
    [self.pieChartLeft reloadData];
    [self.pieChartRight reloadData];

    double delayInSeconds = 1.0;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
       _showAnimationOnly = NO;
       [self.pieChartLeft reloadData];
       [self.pieChartRight reloadData];
    });
}