I'm developing an iPhone application with core-plot chart. With the help of some tutorials, i managed to do it with single touch and drag. How can I make it with multiple touch and drag? Anybody please help me?
ViewController.m
- (void)viewDidLoad
{
[super viewDidLoad];
EskPlotTheme *defaultTheme = [[EskPlotTheme alloc] init];
linePlot = [[EskLinePlot alloc] init];
linePlot.delegate = self;
[linePlot renderInLayer:lineHostingView withTheme:defaultTheme];
[defaultTheme release];
}
EskLinePlot.m
- (id)init
{
self = [super init];
if (self)
{
// setting up the sample data here.
sampleData = [[NSArray alloc] initWithObjects:[NSNumber numberWithInt:6000],
[NSNumber numberWithInt:3000],
[NSNumber numberWithInt:2000],
[NSNumber numberWithInt:5000],
[NSNumber numberWithInt:7000],
[NSNumber numberWithInt:8500],
[NSNumber numberWithInt:6500], nil];
}
return self;
}
- (void)renderInLayer:(CPTGraphHostingView *)layerHostingView withTheme:(CPTTheme *)theme
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
CGRect bounds = layerHostingView.bounds;
// Create the graph and assign the hosting view.
graph = [[CPTXYGraph alloc] initWithFrame:bounds];
layerHostingView.hostedGraph = graph;
[graph applyTheme:theme];
graph.plotAreaFrame.masksToBorder = NO;
// chang the chart layer orders so the axis line is on top of the bar in the chart.
NSArray *chartLayers = [[NSArray alloc] initWithObjects:[NSNumber numberWithInt:CPTGraphLayerTypePlots],
[NSNumber numberWithInt:CPTGraphLayerTypeMajorGridLines],
[NSNumber numberWithInt:CPTGraphLayerTypeMinorGridLines],
[NSNumber numberWithInt:CPTGraphLayerTypeAxisLines],
[NSNumber numberWithInt:CPTGraphLayerTypeAxisLabels],
[NSNumber numberWithInt:CPTGraphLayerTypeAxisTitles],
nil];
graph.topDownLayerOrder = chartLayers;
[chartLayers release];
// Add plot space for horizontal charts
graph.paddingLeft = 60.0;
graph.paddingTop = 70.0;
graph.paddingRight = 20.0;
graph.paddingBottom = 20.0;
// Setup plot space
CPTXYPlotSpace *plotSpace = (CPTXYPlotSpace *)graph.defaultPlotSpace;
plotSpace.allowsUserInteraction = YES;
plotSpace.delegate = self;
int sampleCount = [sampleData count]-1;
plotSpace.xRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0.0f) length:CPTDecimalFromFloat(sampleCount)];
plotSpace.yRange = [CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0.0f) length:CPTDecimalFromFloat(10000)];
// Setup grid line style
CPTMutableLineStyle *majorXGridLineStyle = [CPTMutableLineStyle lineStyle];
majorXGridLineStyle.lineWidth = 1.0f;
majorXGridLineStyle.lineColor = [[CPTColor whiteColor] colorWithAlphaComponent:0.25f];
CPTMutableTextStyle *whiteTextStyle = [[[CPTMutableTextStyle alloc] init] autorelease];
whiteTextStyle.color = [CPTColor whiteColor];
// Setup x-Axis.
CPTXYAxisSet *axisSet = (CPTXYAxisSet *)graph.axisSet;
CPTXYAxis *x = axisSet.xAxis;
x.majorGridLineStyle = majorXGridLineStyle;
x.labelTextStyle = whiteTextStyle;
x.majorIntervalLength = CPTDecimalFromString(@"1");
x.minorTicksPerInterval = 1;
NSArray *exclusionRanges = [NSArray arrayWithObjects:[CPTPlotRange plotRangeWithLocation:CPTDecimalFromInt(0) length:CPTDecimalFromInt(0)], nil];
x.labelExclusionRanges = exclusionRanges;
// Setup y-Axis.
CPTMutableLineStyle *majorYGridLineStyle = [CPTMutableLineStyle lineStyle];
majorYGridLineStyle.lineWidth = 1.0f;
majorYGridLineStyle.lineColor = [[CPTColor whiteColor] colorWithAlphaComponent:0.25];
CPTMutableLineStyle *minorYGridLineStyle = [CPTMutableLineStyle lineStyle];
minorYGridLineStyle.lineWidth = 1.0f;
minorYGridLineStyle.lineColor = [[CPTColor blackColor] colorWithAlphaComponent:0.1];
CPTXYAxis *y = axisSet.yAxis;
y.majorGridLineStyle = majorYGridLineStyle;
y.minorGridLineStyle = minorYGridLineStyle;
y.labelTextStyle = whiteTextStyle;
y.majorIntervalLength = CPTDecimalFromString(@"1000");
y.minorTicksPerInterval = 1;
y.orthogonalCoordinateDecimal = CPTDecimalFromString(@"0");
NSArray *yExlusionRanges = [NSArray arrayWithObjects:
[CPTPlotRange plotRangeWithLocation:CPTDecimalFromFloat(0.0) length:CPTDecimalFromFloat(0.0)],
nil];
y.labelExclusionRanges = yExlusionRanges;
// Create a high plot area
CPTScatterPlot *highPlot = [[[CPTScatterPlot alloc] init] autorelease];
highPlot.identifier = kHighPlot;
CPTMutableLineStyle *highLineStyle = [[highPlot.dataLineStyle mutableCopy] autorelease];
highLineStyle.lineWidth = 2.f;
highLineStyle.miterLimit = 1.0f;
highLineStyle.lineColor = [CPTColor whiteColor];
highPlot.dataLineStyle = highLineStyle;
highPlot.dataSource = self;
CPTColor *areaColor1 = [[CPTColor whiteColor] colorWithAlphaComponent:0.8f];
CPTGradient *areaGradient1 = [CPTGradient gradientWithBeginningColor:areaColor1 endingColor:[[CPTColor whiteColor] colorWithAlphaComponent:0.2f]];
areaGradient1.angle = -90.0f;
CPTFill *areaGradientFill = [CPTFill fillWithGradient:areaGradient1];
highPlot.areaFill = areaGradientFill;
highPlot.areaBaseValue = [[NSDecimalNumber zero] decimalValue];
[graph addPlot:highPlot];
// Create the Savings Marker Plot
selectedCoordination = 2;
touchPlot = [[[CPTScatterPlot alloc] initWithFrame:CGRectNull] autorelease];
touchPlot.identifier = kLinePlot;
touchPlot.dataSource = self;
touchPlot.delegate = self;
[self hideTouchPlotColor];
[graph addPlot:touchPlot];
[pool drain];
}
- (void)hideTouchPlotColor
{
CPTColor *touchPlotColor = [CPTColor clearColor];
CPTMutableLineStyle *savingsPlotLineStyle = [CPTMutableLineStyle lineStyle];
savingsPlotLineStyle.lineColor = touchPlotColor;
CPTPlotSymbol *touchPlotSymbol = [CPTPlotSymbol ellipsePlotSymbol];
touchPlotSymbol.fill = [CPTFill fillWithColor:touchPlotColor];
touchPlotSymbol.lineStyle = savingsPlotLineStyle;
touchPlotSymbol.size = CGSizeMake(12.0f, 12.0f);
CPTMutableLineStyle *touchLineStyle = [CPTMutableLineStyle lineStyle];
touchLineStyle.lineColor = [CPTColor clearColor];
touchLineStyle.lineWidth = 1.0f;
CPTMutableLineStyle *symbolLineStyle = [CPTMutableLineStyle lineStyle];
symbolLineStyle.lineColor = [CPTColor clearColor];
CPTPlotSymbol *plotSymbol = [CPTPlotSymbol ellipsePlotSymbol];
plotSymbol.fill = [CPTFill fillWithColor:[CPTColor clearColor]];
plotSymbol.lineStyle = symbolLineStyle;
plotSymbol.size = CGSizeMake(10.0, 10.0);
touchPlot.plotSymbol = plotSymbol;
touchPlot.dataLineStyle = touchLineStyle;
}
// Assign different color to the touchable line symbol.
- (void)showTouchPlotColor
{
CPTColor *touchPlotColor = [CPTColor orangeColor];
CPTMutableLineStyle *savingsPlotLineStyle = [CPTMutableLineStyle lineStyle];
savingsPlotLineStyle.lineColor = touchPlotColor;
CPTPlotSymbol *touchPlotSymbol = [CPTPlotSymbol ellipsePlotSymbol];
touchPlotSymbol.fill = [CPTFill fillWithColor:touchPlotColor];
touchPlotSymbol.lineStyle = savingsPlotLineStyle;
touchPlotSymbol.size = CGSizeMake(12.0f, 12.0f);
CPTMutableLineStyle *touchLineStyle = [CPTMutableLineStyle lineStyle];
touchLineStyle.lineColor = [CPTColor orangeColor];
touchLineStyle.lineWidth = 1.0f;
CPTMutableLineStyle *symbolLineStyle = [CPTMutableLineStyle lineStyle];
symbolLineStyle.lineColor = [CPTColor blackColor];
CPTPlotSymbol *plotSymbol = [CPTPlotSymbol ellipsePlotSymbol];
plotSymbol.fill = [CPTFill fillWithColor:[CPTColor orangeColor]];
plotSymbol.lineStyle = symbolLineStyle;
plotSymbol.size = CGSizeMake(10.0, 10.0);
touchPlot.plotSymbol = plotSymbol;
touchPlot.dataLineStyle = touchLineStyle;
}
// This method is call when user touch & drag on the plot space.
- (BOOL)plotSpace:(CPTPlotSpace *)space shouldHandlePointingDeviceDraggedEvent:(id)event atPoint:(CGPoint)point
{
// Convert the touch point to plot area frame location
CGPoint pointInPlotArea = [graph convertPoint:point toLayer:graph.plotAreaFrame];
NSDecimal newPoint[2];
[graph.defaultPlotSpace plotPoint:newPoint forPlotAreaViewPoint:pointInPlotArea];
NSDecimalRound(&newPoint[0], &newPoint[0], 0, NSRoundPlain);
int x = [[NSDecimalNumber decimalNumberWithDecimal:newPoint[0]] intValue];
if (x < 0)
{
x = 0;
}
else if (x > [sampleData count])
{
x = [sampleData count];
}
selectedCoordination = x;
if ([delegate respondsToSelector:@selector(linePlot:indexLocation:)])
[delegate linePlot:self indexLocation:x];
[touchPlot reloadData];
return YES;
}
- (BOOL)plotSpace:(CPTPlotSpace *)space shouldHandlePointingDeviceDownEvent:(id)event
atPoint:(CGPoint)point
{
[self showTouchPlotColor];
return YES;
}
- (BOOL)plotSpace:(CPTPlotSpace *)space shouldHandlePointingDeviceUpEvent:(id)event atPoint:(CGPoint)point
{
[self hideTouchPlotColor];
touchPlotSelected = NO;
return YES;
}
#pragma mark -
#pragma mark Scatter plot delegate methods
- (void)scatterPlot:(CPTScatterPlot *)plot plotSymbolWasSelectedAtRecordIndex:(NSUInteger)index
{
if ([(NSString *)plot.identifier isEqualToString:kLinePlot])
{
touchPlotSelected = YES;
[self applyHighLightPlotColor:plot];
if ([delegate respondsToSelector:@selector(linePlot:indexLocation:)])
[delegate linePlot:self indexLocation:index];
}
}
#pragma mark -
#pragma mark Plot Data Source Methods
- (NSUInteger)numberOfRecordsForPlot:(CPTPlot *)plot
{
if ([(NSString *)plot.identifier isEqualToString:kLinePlot])
{
return kNumberOfMarkerPlotSymbols;
}
else {
return [sampleData count];
}
}
- (NSNumber *)numberForPlot:(CPTPlot *)plot field:(NSUInteger)fieldEnum recordIndex:(NSUInteger)index
{
NSNumber *num = nil;
if ( [(NSString *)plot.identifier isEqualToString:kHighPlot] )
{
if ( fieldEnum == CPTScatterPlotFieldY )
{
num = [sampleData objectAtIndex:index];
}
else if (fieldEnum == CPTScatterPlotFieldX)
{
num = [NSNumber numberWithInt:index];
}
}
else if ([(NSString *)plot.identifier isEqualToString:kLinePlot])
{
if ( fieldEnum == CPTScatterPlotFieldY )
{
switch (index) {
case 0:
num = [NSNumber numberWithInt:-1000];
break;
case 2:
num = [NSNumber numberWithInt:12700];
break;
default:
num = [sampleData objectAtIndex:selectedCoordination];
break;
}
}
else if (fieldEnum == CPTScatterPlotFieldX)
{
num = [NSNumber numberWithInt:selectedCoordination];
}
}
return num;
}