CorePlot 点线图的时候,缩放不超过 一定范围的功能实现

来源:互联网 发布:花生壳 80端口 编辑:程序博客网 时间:2024/05/21 14:52

在一个具体的项目中,Y轴 范围只能是 0-10 ,X轴范围只能是49-288.

图表需要支持缩放和移动。并且不能超过这个范围。

实现思路:

1. 设置X和Y轴的范围。

2.实现CPTPlotSpaceDelegate的委托中的 

shouldScaleBy 

shouldHandlePointingDeviceDraggedEvent

willChangePlotRangeTo

三个方法。

3.其中最主要的实现方法是 willChangePlotRangeTo 来,判断将要缩放以后的 x,y轴的范围。如果范围在整个区域中间,则返回新的范围。如果超过 整体范围,则设置成最大范围。

代码主要有

1.实现代理

@interface Chart1ViewController : UIViewController <CPTPlotDataSource, CPTAxisDelegate,CPTPlotSpaceDelegate >

2. 设置x,y轴的最大范围

 CPTPlotRange * xPlotRange; CPTPlotRange * yPlotRange;
    CPTXYPlotSpace *plotSpace =(CPTXYPlotSpace *) graph.defaultPlotSpace;plotSpace.allowsUserInteraction= YES;[plotSpace setDelegate:self];// 设置x,y坐标范围plotSpace.xRange = xPlotRange;plotSpace.yRange = yPlotRange;
//放大缩小的时候调用-(CPTPlotRange *)plotSpace:(CPTPlotSpace *)space willChangePlotRangeTo:(CPTPlotRange *)newRange forCoordinate:(CPTCoordinate)coordinate{//限制缩放和移动的时候。不超过原始范围    if ( coordinate == CPTCoordinateX)    {        if ([ xPlotRange containsRange:newRange])        {            //如果缩放范围在 原始范围内。则返回缩放范围            return newRange;                    }else if([newRange containsRange:xPlotRange])        {            //如果缩放范围在原始范围外,则返回原始范围            return xPlotRange;        }        else{            //如果缩放和移动,导致新范围和元素范围向交叉。则要控制 左边或者右边超界的情况            NSDecimalNumber *myXPlotLocationNSDecimalNumber = [NSDecimalNumber decimalNumberWithDecimal:xPlotRange.location];            NSDecimalNumber *myXPlotLengthNSDecimalNumber = [NSDecimalNumber decimalNumberWithDecimal:xPlotRange.length];                        NSDecimalNumber *myNewRangeLocationNSDecimalNumber = [NSDecimalNumber decimalNumberWithDecimal:newRange.location];            NSDecimalNumber *myNewRangeLengthNSDecimalNumber = [NSDecimalNumber decimalNumberWithDecimal:newRange.length];            NSLog(@"willChangePlotRangeTo  newRange :%@\n xplotRange is %@",newRange,xPlotRange);            if ( myXPlotLocationNSDecimalNumber.doubleValue >= myNewRangeLocationNSDecimalNumber.doubleValue)            {                //限制左边不超界                CPTPlotRange * returnPlot = [[CPTPlotRange alloc ] initWithLocation:xPlotRange.location length:newRange.length];                return returnPlot;            }            if ((myNewRangeLocationNSDecimalNumber.doubleValue + myNewRangeLengthNSDecimalNumber.doubleValue) > (myXPlotLengthNSDecimalNumber.doubleValue +myXPlotLocationNSDecimalNumber.doubleValue))            {                double offset = (myNewRangeLocationNSDecimalNumber.doubleValue + myNewRangeLengthNSDecimalNumber.doubleValue) -(myXPlotLengthNSDecimalNumber.doubleValue+myXPlotLocationNSDecimalNumber.doubleValue);                //限制右边不超界                CPTPlotRange * returnPlot = [[CPTPlotRange alloc ] initWithLocation:[NSDecimalNumber numberWithDouble:(myNewRangeLocationNSDecimalNumber.doubleValue - offset)].decimalValue length:newRange.length];//                CPTPlotRange * returnPlot = [[CPTPlotRange alloc ] initWithLocation:newRange.location length:xPlotRange.length];                NSLog(@"右边超界,超界 %f", offset);                NSLog(@"将要返回的 range 是:%@",returnPlot);                return returnPlot;            }        }        return newRange;    }else{        return yPlotRange;    }}
-(BOOL)plotSpace:(CPTPlotSpace *)space shouldScaleBy:(CGFloat)interactionScale aboutPoint:(CGPoint)interactionPoint{    return true;}-(BOOL) plotSpace:(CPTPlotSpace *)space shouldHandlePointingDeviceDraggedEvent:(UIEvent *)event atPoint:(CGPoint)point{      return YES;}