damien murphy.
damien murphy.

Reputation: 371

Core-Plot iOS - Adding multiple charts to a screen only every second chart displays

I have a parent view with 6 UIViews to which I add my core-plot charts (This is working fine but only every second chart displays for some reason!)

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
if(!chartVC1){
    chartVC1 = [[ChartVC alloc] initWithIdentifier:@"plot1"];
    //[chartVC1 setKPlotIdentifier:@"plot1"];
    [chartVC1.view setFrame:self.Panel1.frame];
}
[self.Panel1 addSubview:chartVC1.view];

if(!chartVC3){
    chartVC3 = [[ChartVC alloc] initWithIdentifier:@"plot2"];
    [chartVC3.view setFrame:self.Panel3.frame];
}
[self.Panel3 addSubview:chartVC3.view];

if(!chartVC2){
    chartVC2 = [[ChartVC alloc] initWithIdentifier:@"plot3"];
    [chartVC2.view setFrame:self.Panel2.frame];
}

[self.Panel2 addSubview:chartVC2.view];

if(!chartVC4){
    chartVC4 =  [[ChartVC alloc] initWithIdentifier:@"plot4"];
    [chartVC4.view setFrame:self.Panel4.frame];
}
[self.Panel4 addSubview:chartVC4.view];

if(!chartVC5){
    chartVC5 =  [[ChartVC alloc] initWithIdentifier:@"plot5"];
    [chartVC5.view setFrame:self.Panel5.frame];

}
[self.Panel5 addSubview:chartVC5.view];

if(!chartVC6){
    chartVC6 = [[ChartVC alloc] initWithIdentifier:@"plot6"];
    [chartVC6.view setFrame:self.Panel6.frame];
}
[self.Panel6 addSubview:chartVC6.view];
}

Here is some of my code for the class ChartVC

-(void)renderInLayer { CPTXYGraph *graph = [[[CPTXYGraph alloc] initWithFrame:self.view.bounds] autorelease];

[self addGraph:graph toHostingView:self.view];
[self applyTheme:nil toGraph:graph withDefault:[CPTTheme themeNamed:kCPTDarkGradientTheme]];

//[self setTitleDefaultsForGraph:graph withBounds:self.view.bounds];
//[self setPaddingDefaultsForGraph:graph withBounds:self.view.bounds];

graph.plotAreaFrame.paddingTop    = -20.0;
 graph.plotAreaFrame.paddingRight  = -20.0;
 graph.plotAreaFrame.paddingBottom = -20.0;
 graph.plotAreaFrame.paddingLeft      = -20.0;

graph.plotAreaFrame.plotArea.frame = self.view.bounds;

graph.backgroundColor = [[UIColor whiteColor] CGColor];
// Grid line styles
CPTMutableLineStyle *majorGridLineStyle = [CPTMutableLineStyle lineStyle];
majorGridLineStyle.lineWidth = 0.75;
majorGridLineStyle.lineColor = [[CPTColor colorWithGenericGray:0.2] colorWithAlphaComponent:0.75];

CPTMutableLineStyle *minorGridLineStyle = [CPTMutableLineStyle lineStyle];
minorGridLineStyle.lineWidth = 0.25;
minorGridLineStyle.lineColor = [[CPTColor whiteColor] colorWithAlphaComponent:0.1];

// Axes
// X axis
CPTXYAxisSet *axisSet = (CPTXYAxisSet *)graph.axisSet;
CPTXYAxis *x          = axisSet.xAxis;
x.labelingPolicy              = CPTAxisLabelingPolicyAutomatic;
x.orthogonalCoordinateDecimal = CPTDecimalFromUnsignedInteger(0);
x.majorGridLineStyle          = majorGridLineStyle;
x.minorGridLineStyle          = minorGridLineStyle;
x.minorTicksPerInterval       = 9;
//x.title                         = @"X Axis";
//x.titleOffset               = 35.0;
NSNumberFormatter *labelFormatter = [[NSNumberFormatter alloc] init];
labelFormatter.numberStyle = NSNumberFormatterNoStyle;
x.labelFormatter           = labelFormatter;
[labelFormatter release];

// Y axis
CPTXYAxis *y = axisSet.yAxis;
y.labelingPolicy              = CPTAxisLabelingPolicyAutomatic;
y.orthogonalCoordinateDecimal = CPTDecimalFromUnsignedInteger(0);
y.majorGridLineStyle          = majorGridLineStyle;
y.minorGridLineStyle          = minorGridLineStyle;
y.minorTicksPerInterval       = 3;
//y.labelOffset               = 5.0;
//y.title                         = @"Y Axis";
//y.titleOffset               = 30.0;
y.axisConstraints             = [CPTConstraints constraintWithLowerOffset:0.0];

// Rotate the labels by 45 degrees, just to show it can be done.
x.labelRotation = M_PI * 0.25;

// Create the plot
CPTScatterPlot *dataSourceLinePlot1 = [[[CPTScatterPlot alloc] init] autorelease];
dataSourceLinePlot1.identifier    = [self kPlotIdentifier];
//NSLog(@"set identifier: %@", [self kPlotIdentifier]);
dataSourceLinePlot1.cachePrecision = CPTPlotCachePrecisionDouble;

CPTMutableLineStyle *lineStyle1 = [[dataSourceLinePlot1.dataLineStyle mutableCopy] autorelease];
lineStyle1.lineWidth                 = 1.0;
lineStyle1.lineColor                 = [CPTColor redColor];
dataSourceLinePlot1.dataLineStyle = lineStyle1;

dataSourceLinePlot1.dataSource = self;
[graph addPlot:dataSourceLinePlot1];

 // Plot space
 CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)graph.defaultPlotSpace;
 plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromUnsignedInteger(0) length:CPTDecimalFromUnsignedInteger(kMaxDataPoints - 1)];
 plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromUnsignedInteger(0) length:CPTDecimalFromUnsignedInteger(100)];

}

I would think the issue was my own fault if only the 1st chart displayed but because every second chart displays it doesn't make any sense to me..

My only guess is it is some sort of timing issue but I debugged it and delayed the creation of each chart and it made no difference..

I even removed the 3rd, 5th charts to see if the others now rendered but the same 3 charts that did not display previously were still not visible which really threw me off.. (ie. only the 1st chart displayed out of the 4 enabled!)

Any help on this much appreciated...

I may just use the code from the Apple Developer Library that renders the accelerometer data as it is very lightweight to support 6 charts on a screen at one time without issue...

Core-Plot just doesn't seem up to the task I guess...

Upvotes: 1

Views: 633

Answers (1)

Eric Skroch
Eric Skroch

Reputation: 27381

You didn't say which graphs aren't showing up, but since it's always the same ones, I suspect there's an issue with the view hierarchy. Try changing

`[chartVC1.view setFrame:self.Panel1.frame];`

to

`[chartVC1.view setFrame:self.Panel1.bounds];`

for each graph.

Upvotes: 1

Related Questions