CorePlot:我怎么知道Graphic完成绘制?像ViewDidLoad方法一样吗?
因为我在加载内容时在前面有一个加载视图。
我正在使用CorePlot示例代码中的AAPLOT。
我认为以下功能告诉我它完成了图形,但事实并非如此。
-(void)dataPullerDidFinishFetch:(APYahooDataPuller *)dp;
是否有任何类似ViewDidLoad的功能可以让我知道它何时成功完成绘图?
谢谢
答案 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),但它足以满足我目前的需求。