1

我刚刚更新到 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 之后,在绘制任何数据之前拍摄的。任何帮助将不胜感激。

1.0版 1.1版

附加信息

在 Instruments 中运行 1.1 版本的代码时,我发现轴最终会自行纠正。在我的代码中运行的最后一件事是 viewDidLoad。在这个测试用例中,我从不调用 -reloadData(无论如何我都不会调用它),并且一旦加载视图就不会发生任何其他事情。但是,在 15 到 40 秒后(它会因运行而异),轴会自行修复,并且 Instruments 会显示一些额外的调用。大部分看起来像系统调用,但有一个调用 -[CPTAnnotationHostLayer sublayersExcludedFromAutomaticLayout] 和下面的 -[__NSPlaceholderSet initWithObjects:count:]。但是,这些都不在我的代码中,所以我似乎无法追踪它们是从哪里调用的,或者为什么这么晚,或者为什么随机。

4

1 回答 1

0

这听起来像一个核心情节错误。请在Core Plot 问题跟踪器上报告。

于 2012-12-04T00:03:46.847 回答