2012-02-01 43 views
0

我有一種情況,我的應用程序連接到服務器以獲取數據並繪製在圖上。當調用初始化圖的函數被調用時,該圖被重新繪製在錯誤的地方,並自動將其自身恢復到它應該在的位置。這會導致過程中出現閃爍。 我每隔10秒就有一個計時器連接到服務器。 以下是繪圖初始化代碼。閃爍的iOS核心圖圖

-(id)initWithHostingView:(CPTGraphHostingView *)hostingView andData:(NSMutableArray *)data 
    { 

    self = [super init]; 

if (self != nil) { 
    self.hostingView = hostingView; 
    self.graphData = data; 
    self.graph = nil; 
} 

return self; 
} 

//如果我們還沒有圖形對象,這將創建圖的實際工作。

-(void)initialisePlot:(NSUInteger)indexOfPlot 
    { 
    // Start with some simple sanity checks before we kick off 
    if ((self.hostingView == nil) || (self.graphData == nil)) { 
    NSLog(@"TUTSimpleScatterPlot: Cannot initialise plot without hosting view or  data."); 
    return; 
    } 

if (self.graph != nil) { 
    NSLog(@"TUTSimpleScatterPlot: Graph object already exists."); 
    return; 
} 

// Create a graph object which we will use to host just one scatter plot. 

CGRect frame; 
//CGRect frame = [self.hostingView bounds]; 
if(indexOfPlot == 0){ 
self.graph = [[CPTXYGraph alloc] initWithFrame:frame]; 

// Add some padding to the graph, with more at the bottom for axis labels. 
self.graph.plotAreaFrame.paddingTop = 500.0f; 
self.graph.plotAreaFrame.paddingRight = 20.0f; 
self.graph.plotAreaFrame.paddingBottom = 50.0f; 
self.graph.plotAreaFrame.paddingLeft= 20.0f; 

// Tie the graph we've created with the hosting view. 
self.hostingView.hostedGraph = self.graph; 

// If you want to use one of the default themes - apply that here. 
[self.graph applyTheme:[CPTTheme themeNamed:kCPTPlainWhiteTheme]]; 

// Create a line style that we will apply to the axis and data line. 
CPTMutableLineStyle *lineStyle = [CPTMutableLineStyle lineStyle]; 
lineStyle.lineColor = [CPTColor redColor]; 
lineStyle.lineWidth = 2.0f; 

// Create a text style that we will use for the axis labels. 
CPTMutableTextStyle *textStyle = [CPTMutableTextStyle textStyle]; 
textStyle.fontName = @"Helvetica"; 
textStyle.fontSize = 14; 
textStyle.color = [CPTColor blackColor]; 

// Create the plot symbol we're going to use. 
CPTPlotSymbol *plotSymbol = [CPTPlotSymbol ellipsePlotSymbol]; 
plotSymbol.lineStyle = lineStyle; 
plotSymbol.size = CGSizeMake(8.0, 8.0); 

// Setup some floats that represent the min/max values on our axis. 
float xAxisMin = -10; 
float xAxisMax = 10; 
float yAxisMin = 0; 
float yAxisMax = 100; 

// We modify the graph's plot space to setup the axis' min/max values. 
CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)self.graph.defaultPlotSpace; 
plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(xAxisMin) length:CPTDecimalFromFloat(xAxisMax - xAxisMin)]; 
plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(yAxisMin) length:CPTDecimalFromFloat(yAxisMax - yAxisMin)]; 

// Modify the graph's axis with a label, line style, etc. 
CPTXYAxisSet *axisSet = (CPTXYAxisSet *)self.graph.axisSet; 

axisSet.xAxis.title = @"Data X"; 
axisSet.xAxis.titleTextStyle = textStyle; 
axisSet.xAxis.titleOffset = 30.0f; 
axisSet.xAxis.axisLineStyle = lineStyle; 
axisSet.xAxis.majorTickLineStyle = lineStyle; 
axisSet.xAxis.minorTickLineStyle = lineStyle; 
axisSet.xAxis.labelTextStyle = textStyle; 
axisSet.xAxis.labelOffset = 3.0f; 
axisSet.xAxis.majorIntervalLength = CPTDecimalFromFloat(2.0f); 
axisSet.xAxis.minorTicksPerInterval = 1; 
axisSet.xAxis.minorTickLength = 5.0f; 
axisSet.xAxis.majorTickLength = 7.0f; 

axisSet.yAxis.title = @"Data Y"; 
axisSet.yAxis.titleTextStyle = textStyle; 
axisSet.yAxis.titleOffset = 40.0f; 
axisSet.yAxis.axisLineStyle = lineStyle; 
axisSet.yAxis.majorTickLineStyle = lineStyle; 
axisSet.yAxis.minorTickLineStyle = lineStyle; 
axisSet.yAxis.labelTextStyle = textStyle; 
axisSet.yAxis.labelOffset = 3.0f; 
axisSet.yAxis.majorIntervalLength = CPTDecimalFromFloat(10.0f); 
axisSet.yAxis.minorTicksPerInterval = 1; 
axisSet.yAxis.minorTickLength = 5.0f; 
axisSet.yAxis.majorTickLength = 7.0f; 

// Add a plot to our graph and axis. We give it an identifier so that we 
// could add multiple plots (data lines) to the same graph if necessary. 
CPTScatterPlot *plot = [[CPTScatterPlot alloc] init]; 
plot.dataSource = self; 
plot.identifier = @"mainplot"; 
plot.dataLineStyle = lineStyle; 
plot.plotSymbol = plotSymbol; 
    //[self.graph reloadData]; 
[self.graph addPlot:plot]; 
} 
if(indexOfPlot == 1){ 
    self.graph = [[CPTXYGraph alloc] initWithFrame:frame]; 

    // Add some padding to the graph, with more at the bottom for axis labels. 
    self.graph.plotAreaFrame.paddingTop = 20.0f; 
    self.graph.plotAreaFrame.paddingRight = 20.0f; 
    self.graph.plotAreaFrame.paddingBottom = 600.0f; 
    self.graph.plotAreaFrame.paddingLeft= 20.0f; 

    // Tie the graph we've created with the hosting view. 
    self.hostingView.hostedGraph = self.graph; 

    // If you want to use one of the default themes - apply that here. 
    [self.graph applyTheme:[CPTTheme themeNamed:kCPTPlainWhiteTheme]]; 

    // Create a line style that we will apply to the axis and data line. 
    CPTMutableLineStyle *lineStyle = [CPTMutableLineStyle lineStyle]; 
    lineStyle.lineColor = [CPTColor redColor]; 
    lineStyle.lineWidth = 2.0f; 

    // Create a text style that we will use for the axis labels. 
    CPTMutableTextStyle *textStyle = [CPTMutableTextStyle textStyle]; 
    textStyle.fontName = @"Helvetica"; 
    textStyle.fontSize = 14; 
    textStyle.color = [CPTColor blackColor]; 

    // Create the plot symbol we're going to use. 
    CPTPlotSymbol *plotSymbol = [CPTPlotSymbol crossPlotSymbol]; 
    plotSymbol.lineStyle = lineStyle; 
    plotSymbol.size = CGSizeMake(8.0, 8.0); 

    // Setup some floats that represent the min/max values on our axis. 
    float xAxisMin = -10; 
    float xAxisMax = 10; 
    float yAxisMin = 0; 
    float yAxisMax = 100; 

    // We modify the graph's plot space to setup the axis' min/max values. 
    CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)self.graph.defaultPlotSpace; 
    plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(xAxisMin) length:CPTDecimalFromFloat(xAxisMax - xAxisMin)]; 
    plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(yAxisMin) length:CPTDecimalFromFloat(yAxisMax - yAxisMin)]; 

    // Modify the graph's axis with a label, line style, etc. 
    CPTXYAxisSet *axisSet = (CPTXYAxisSet *)self.graph.axisSet; 

    axisSet.xAxis.title = @"Data X"; 
    axisSet.xAxis.titleTextStyle = textStyle; 
    axisSet.xAxis.titleOffset = 30.0f; 
    axisSet.xAxis.axisLineStyle = lineStyle; 
    axisSet.xAxis.majorTickLineStyle = lineStyle; 
    axisSet.xAxis.minorTickLineStyle = lineStyle; 
    axisSet.xAxis.labelTextStyle = textStyle; 
    axisSet.xAxis.labelOffset = 3.0f; 
    axisSet.xAxis.majorIntervalLength = CPTDecimalFromFloat(2.0f); 
    axisSet.xAxis.minorTicksPerInterval = 1; 
    axisSet.xAxis.minorTickLength = 5.0f; 
    axisSet.xAxis.majorTickLength = 7.0f; 

    axisSet.yAxis.title = @"Data Y"; 
    axisSet.yAxis.titleTextStyle = textStyle; 
    axisSet.yAxis.titleOffset = 40.0f; 
    axisSet.yAxis.axisLineStyle = lineStyle; 
    axisSet.yAxis.majorTickLineStyle = lineStyle; 
    axisSet.yAxis.minorTickLineStyle = lineStyle; 
    axisSet.yAxis.labelTextStyle = textStyle; 
    axisSet.yAxis.labelOffset = 3.0f; 
    axisSet.yAxis.majorIntervalLength = CPTDecimalFromFloat(10.0f); 
    axisSet.yAxis.minorTicksPerInterval = 1; 
    axisSet.yAxis.minorTickLength = 5.0f; 
    axisSet.yAxis.majorTickLength = 7.0f; 

    // Add a plot to our graph and axis. We give it an identifier so that we 
    // could add multiple plots (data lines) to the same graph if necessary. 
    CPTScatterPlot *plot = [[CPTScatterPlot alloc] init]; 
    plot.dataSource = self; 
    plot.identifier = @"mainplot"; 
    plot.dataLineStyle = lineStyle; 
    plot.plotSymbol = plotSymbol; 
    //[self.graph reloadData]; 
    [self.graph addPlot:plot]; 

    } 
} 

我必須重新考慮它被初始化的方式嗎?

+0

爲什麼所有的代碼複製了'indexOfPlot == 0'和'indexOfPlot == 1'?如果你通過另一個索引會發生什麼? – 2012-02-02 02:05:54

+0

你好埃裏克,我想添加兩個圖到同一頁面。但是,上述功能一次只能使用一個。我還沒有嘗試過傳遞另一個索引。如果發生這種情況,它應該是一個空白屏幕 – 2012-02-02 17:22:17

回答

0

初始化frame。圖形初始化時,您可能在那裏有垃圾值,然後在將圖形添加到託管視圖時得到更正。

CGRect frame = [self.hostingView bounds]; 

甚至只是

CGRect frame = CGRectZero; 
+0

當調用函數initialiseplot時,標籤仍在移動。 – 2012-02-04 05:41:07