バージョン1.1に更新したところ、軸ラベルが最初は正しく表示されていないか、正しく更新されていないことにすぐに気付きました。
1.0では、それらは正しくロードされ(ビューが最初に表示されたとき)、1秒に1回、範囲(CPTPlotRange)とデータ(-reloadData)、および軸とデータが毎回正しく更新されます。ただし、1.1では、データと軸の目盛りは正しく更新されていますが、軸のラベルは遅れています。新しい軸ラベルが左下隅から始まり、3秒以上かけて正しい位置に移動することがあります。また、ラベルがすでに存在する場合は、軸の目盛りから1秒以上遅れます。
コードを変更せず、古い1.0ファイルを削除して、1.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の直後、データがプロットされる前に撮影された2つのスクリーンショットです。どんな助けでも大歓迎です。
追加情報
Instruments内でバージョン1.1を使用してコードを実行しているときに、軸が最終的に自動的に修正されることがわかりました。私のコードで最後に実行するのはviewDidLoadです。このテストケースでは、-reloadDataを呼び出すことはありません(とにかく呼び出しても違いはありません)。ビューが読み込まれると、他に何も起こりません。ただし、15〜40秒後(実行ごとに異なります)、軸は自動的に修正され、Instrumentsはいくつかの追加の呼び出しを表示します。ほとんどはシステムコールのように見えますが、-[CPTAnnotationHostLayersublayersExcludedFromAutomaticLayout]とその下の-[__NSPlaceholderSet initWithObjects:count:]への呼び出しが1つあります。ただし、これらはどちらも私のコードに含まれていないため、どこから呼び出されたのか、なぜそれほど遅くなったのか、なぜランダムに呼び出されたのかを追跡できないようです。