我刚刚更新到 1.1 版,马上注意到我的轴标签一开始没有正确显示,或者没有正确更新。
在 1.0 中,它们会正确加载(当视图首次显示时),并且我会每秒钟更新一次范围 (CPTPlotRange) 和数据 (-reloadData),并且每次都正确更新轴和数据。但是,现在使用 1.1,数据和轴刻度线正在正确更新,但轴标签滞后。有时我会看到新的轴标签从左下角开始,超过 3 秒迁移到正确位置。如果标签已经存在,它将落后于轴刻度线 1 秒或更长时间。
我没有更改任何代码,只删除了旧的 1.0 文件并将它们替换为 1.1 文件。以下是与其中一个图相关的所有代码。
- (void) prepareGraphs {
//Prepare beat graph
//beatGraph defined as CPTXYGraph
//beatGraphView defined as CPTGraphHostingView in both class and storyboard
beatGraph = [[CPTXYGraph alloc] initWithFrame:self.beatGraphView.frame];
self.beatGraphView.collapsesLayers = NO;
self.beatGraphView.hostedGraph = beatGraph;
beatGraph.paddingLeft = 0.0;
beatGraph.paddingTop = 0.0;
beatGraph.paddingRight = 0.0;
beatGraph.paddingBottom = 0.0;
CPTPlotAreaFrame *beatPlotAreaframe = (CPTPlotAreaFrame *)beatGraph.plotAreaFrame;
beatPlotAreaframe.paddingLeft = 30;
beatPlotAreaframe.paddingRight = 5;
CPTXYPlotSpace *beatPlotSpace = (CPTXYPlotSpace *)beatGraph.defaultPlotSpace;
beatPlotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0)
length:CPTDecimalFromFloat(31)];
beatPlotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(75)
length:CPTDecimalFromFloat(20)];
CPTXYAxisSet *beatPlotAxisSet = (CPTXYAxisSet *)beatGraph.axisSet;
beatPlotAxisSet.xAxis.hidden = TRUE;
beatPlotAxisSet.yAxis.majorIntervalLength = [[NSDecimalNumber decimalNumberWithString:@"10"] decimalValue];
beatPlotAxisSet.yAxis.minorTicksPerInterval = 4;
beatPlotAxisSet.yAxis.majorTickLineStyle = lineStyleThick;
beatPlotAxisSet.yAxis.minorTickLineStyle = lineStyleThin;
beatPlotAxisSet.yAxis.axisLineStyle = lineStyleThick;
beatPlotAxisSet.yAxis.minorTickLength = 4.0f;
beatPlotAxisSet.yAxis.majorTickLength = 5.0f;
beatPlotAxisSet.yAxis.labelOffset = 0.0f;
beatPlotAxisSet.yAxis.labelFormatter = integerLabelFormat;
//beat plot
//beatPlot defined as CPTScatterPlot
beatPlot = [[CPTScatterPlot alloc] init];
beatPlot.identifier = @"Beat Plot";
CPTMutableLineStyle *beatPlotLineStyle = [beatPlot.dataLineStyle mutableCopy];
beatPlotLineStyle.lineWidth = 1.0f;
beatPlotLineStyle.lineColor = [CPTColor redColor];
beatPlot.dataLineStyle = beatPlotLineStyle;
CPTPlotSymbol *beatPlotSymbol = [CPTPlotSymbol ellipsePlotSymbol];
beatPlotSymbol.fill = [CPTFill fillWithColor:[CPTColor greenColor]];
beatPlotSymbol.size = CGSizeMake(5.0, 5.0);
beatPlot.plotSymbol = beatPlotSymbol;
beatPlot.cachePrecision = CPTPlotCachePrecisionDouble;
[beatGraph addPlot:beatPlot];
}
- (void)updateGraphs {
//Get the cached arrays for the beat and spectrum plots
[self.currentRecord getBeatArraysForSeconds:30 beats:&beatsForBeatPlot xArray:beatXArray yArray:beatYArray];
//Set beat graph y-axis
CPTXYPlotSpace *beatPlotSpace = (CPTXYPlotSpace *)beatGraph.defaultPlotSpace;
double minbpm;
double maxbpm;
vDSP_maxvD(beatYArray, 1, &maxbpm, beatsForBeatPlot);
vDSP_minvD(beatYArray, 1, &minbpm, beatsForBeatPlot);
maxbpm*=1.01;
minbpm*=0.99;
beatPlotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromDouble(minbpm)
length:CPTDecimalFromDouble(maxbpm-minbpm)];
//reloaddata
[beatGraph reloadData];
}
这是两个屏幕截图,都是在 viewDidAppear 之后,在绘制任何数据之前拍摄的。任何帮助将不胜感激。
附加信息
在 Instruments 中运行 1.1 版本的代码时,我发现轴最终会自行纠正。在我的代码中运行的最后一件事是 viewDidLoad。在这个测试用例中,我从不调用 -reloadData(无论如何我都不会调用它),并且一旦加载视图就不会发生任何其他事情。但是,在 15 到 40 秒后(它会因运行而异),轴会自行修复,并且 Instruments 会显示一些额外的调用。大部分看起来像系统调用,但有一个调用 -[CPTAnnotationHostLayer sublayersExcludedFromAutomaticLayout] 和下面的 -[__NSPlaceholderSet initWithObjects:count:]。但是,这些都不在我的代码中,所以我似乎无法追踪它们是从哪里调用的,或者为什么这么晚,或者为什么随机。