CorePlot:我怎么知道Graphic完成绘制?什么像ViewDidLoad方法?

时间:2012-02-17 07:04:41

标签: iphone charts core-plot

CorePlot:我怎么知道Graphic完成绘制?像ViewDidLoad方法一样吗?

因为我在加载内容时在前面有一个加载视图。

我正在使用CorePlot示例代码中的AAPLOT。

我认为以下功能告诉我它完成了图形,但事实并非如此。

-(void)dataPullerDidFinishFetch:(APYahooDataPuller *)dp;

是否有任何类似ViewDidLoad的功能可以让我知道它何时成功完成绘图?

谢谢

2 个答案:

答案 0 :(得分:3)

Core Animation负责Core Plot中的所有绘图。完整的Core Plot图有很多层;每一个都是独立绘制的。没有定义的绘图顺序,绘制完成时Core Animation也不提供任何回调。

您可以放置​​加载视图,直到查询了所有数据的数据源。如果加载数据需要很长时间,则不应阻止Core Plot等待它进入。在内部缓存数据并在图形(或单个图)准备好时调用-reloadData。只需在等待数据进入时显示加载视图。一旦告诉Core Plot加载它,请删除加载视图。

答案 1 :(得分:2)

为了构建这个功能,我在numberForPlot:field:recordIndex:的实现中添加了一些代码,以检查记录索引是否等于“源数据中的记录数减1”(因为绘图数据源)使用从零开始的编号。

因为CorePlot按顺序渲染条形图上的条形图,所以我可以确信当它到达条形码数量等于我的数据源中的记录数减1时,它就在最后一条记录上(这可能是如果您在图表中绘制多个绘图,则会出现更严重的细微差别。)

此时,我只是在finishedDrawingGraph方法中创建名为numberForPlot:field:recordIndex:的iOS通知:

// If this is the last bar in the chart for this layer, send notification to
// say that the graph has finished drawing
if (index == [self.dataController.builds count]-1
{
    [[NSNotificationCenter defaultCenter] postNotificationName:@"finishedDrawingGraph" object:nil];
}

我的视图控制器中有一个监听器来监听finishedDrawingGraph个事件。由于通知系统相对较慢(与直接调用方法相比),到收到此通知时,图形几乎肯定已完成绘制。为了增加更多的确定性,我可以在收到通知后等待一段时间。

- (void)eventHandler: (NSNotification *) notification
{
    if ([notification.name isEqualToString:@"finishedDrawingGraph"])
    {
        NSLog2 (@"Graph drawn.");

        // Do something with your graph. 
        // For example, create an image of the graph
        UIImage *graphImage = [graph imageOfLayer];
    }
}

这不是一个特别优雅的解决方案,它可能会在某些情况下崩溃(系统负载很重,更新到CorePlot),但它足以满足我目前的需求。