From 21d3023a9b7b6aff68c1170e345951396b1c6cfd Mon Sep 17 00:00:00 2001 From: 单军华 Date: Tue, 31 Jul 2018 13:35:21 +0800 Subject: [PATCH] no message --- screendisplay/screendisplay/Classes/ThirdClass/JHChart/JHLineChart.m | 1212 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 1,212 insertions(+), 0 deletions(-) diff --git a/screendisplay/screendisplay/Classes/ThirdClass/JHChart/JHLineChart.m b/screendisplay/screendisplay/Classes/ThirdClass/JHChart/JHLineChart.m new file mode 100755 index 0000000..e4a1651 --- /dev/null +++ b/screendisplay/screendisplay/Classes/ThirdClass/JHChart/JHLineChart.m @@ -0,0 +1,1212 @@ +// +// JHLineChart.m +// JHChartDemo +// +// Created by cjatech-������ on 16/4/10. +// Copyright �� 2016��� JH. All rights reserved. +// + +#import "JHLineChart.h" +#define kXandYSpaceForSuperView 20.0 +#define XlineItemMAXCount 10 +#define YlineItemMAXCount 10 + +@interface JHLineChart () + +@property (assign, nonatomic) CGFloat xLength; +@property (assign , nonatomic) CGFloat yLength; +@property (assign , nonatomic) CGFloat perXLen ; +@property (assign , nonatomic) CGFloat perYlen ; +@property (assign , nonatomic) CGFloat perValue ; +@property (nonatomic,strong) NSMutableArray * drawDataArr; +@property (nonatomic,strong) CAShapeLayer *shapeLayer; +@property (assign , nonatomic) BOOL isEndAnimation ; +@property (nonatomic,strong) NSMutableArray * layerArr; +@end + +@implementation JHLineChart + + + +/** + * ��������������������� + * + * @param frame frame + * @param lineChartType ��������������� + * + * @return ������������������ + */ +-(instancetype)initWithFrame:(CGRect)frame andLineChartType:(JHLineChartType)lineChartType +{ + + if (self = [super initWithFrame:frame]) { + self.backgroundColor = [UIColor clearColor]; + _lineType = lineChartType; + _lineWidth = 0.5; + _xyFontSize = 7.0; + _numberFontSize = 7.0; + self.contentInsets = UIEdgeInsetsMake(10, 20, 10, 10); + _yLineDataArr = @[@"100",@"200",@"300",@"400",@"500",@"600",@"700",@"800"];//[NSMutableArray array]; + _xLineDataArr = [NSMutableArray array]; + _xAndYLineColor = [UIColor darkGrayColor]; + _pointNumberColorArr = @[[UIColor redColor]]; + _positionLineColorArr = @[[UIColor darkGrayColor]]; + _pointColorArr = @[[UIColor orangeColor]]; + _xAndYNumberColor = [UIColor darkGrayColor]; + _valueLineColorArr = @[[UIColor redColor]]; + _layerArr = [NSMutableArray array]; + _showYLine = YES; + _showYLevelLine = NO; + _showValueLeadingLine = YES; + _contentFillColorArr = @[[UIColor lightGrayColor]]; + [self configChartXAndYLength]; + [self configChartOrigin]; + [self configPerXAndPerY]; +} + return self; + +} + +/** + * ������������������ + */ +-(void)clear +{ + + _valueArr = nil; + _drawDataArr = nil; + + for (CALayer *layer in _layerArr) { + + [layer removeFromSuperlayer]; + } + [self showAnimation]; + +} + +/** + * ������������X���y��������������� + */ +- (void)configPerXAndPerY +{ + switch (_lineChartQuadrantType) + { +// case JHLineChartQuadrantTypeFirstQuardrant: +// { +// _perXLen = (_xLength-kXandYSpaceForSuperView)/(XlineItemMAXCount-1); +// _perYlen = (_yLength-kXandYSpaceForSuperView)/YlineItemMAXCount; +// } +// break; +// case JHLineChartQuadrantTypeFirstAndSecondQuardrant: +// { +// _perXLen = (_xLength/2-kXandYSpaceForSuperView)/XlineItemMAXCount; +// _perYlen = (_yLength-kXandYSpaceForSuperView)/YlineItemMAXCount; +// } +// break; +// case JHLineChartQuadrantTypeFirstAndFouthQuardrant: +// { +// _perXLen = (_xLength-kXandYSpaceForSuperView)/(XlineItemMAXCount-1); +// _perYlen = (_yLength/2-kXandYSpaceForSuperView)/YlineItemMAXCount; +// } +// break; +// case JHLineChartQuadrantTypeAllQuardrant: +// { +// _perXLen = (_xLength/2-kXandYSpaceForSuperView)/(XlineItemMAXCount); +// _perYlen = (_yLength/2-kXandYSpaceForSuperView)/YlineItemMAXCount; +// } +// break; +// +// default: +// break; + + case JHLineChartQuadrantTypeFirstQuardrant: + { + _perXLen = (_xLength-kXandYSpaceForSuperView)/(_xLineDataArr.count-1); + _perYlen = (_yLength-kXandYSpaceForSuperView)/_yLineDataArr.count; + } + break; + case JHLineChartQuadrantTypeFirstAndSecondQuardrant: + { + _perXLen = (_xLength/2-kXandYSpaceForSuperView)/[_xLineDataArr[0] count]; + _perYlen = (_yLength-kXandYSpaceForSuperView)/_yLineDataArr.count; + } + break; + case JHLineChartQuadrantTypeFirstAndFouthQuardrant: + { + _perXLen = (_xLength-kXandYSpaceForSuperView)/(_xLineDataArr.count-1); + _perYlen = (_yLength/2-kXandYSpaceForSuperView)/[_yLineDataArr[0] count]; + } + break; + case JHLineChartQuadrantTypeAllQuardrant: + { + _perXLen = (_xLength/2-kXandYSpaceForSuperView)/([_xLineDataArr[0] count]); + _perYlen = (_yLength/2-kXandYSpaceForSuperView)/[_yLineDataArr[0] count]; + } + break; + + default: + break; + } + +} + + +/** + * ������LineChartQuardrantType���setter������ ��������������������������� + * + */ +-(void)setLineChartQuadrantType:(JHLineChartQuadrantType)lineChartQuadrantType{ + + _lineChartQuadrantType = lineChartQuadrantType; + [self configChartOrigin]; + +} + + + +/** + * ������X���Y������������ + */ +- (void)configChartXAndYLength +{ + _xLength = CGRectGetWidth(self.frame)-self.contentInsets.left-self.contentInsets.right; + _yLength = CGRectGetHeight(self.frame)-self.contentInsets.top-self.contentInsets.bottom; +} + + +/** + * ������ValueArr���setter������ ���������������Y��������������� + * + */ +-(void)setValueArr:(NSMutableArray *)valueArr +{ + + _valueArr = valueArr; + + [self updateYScale]; + + +} + +-(void)clearLine +{ + for (CALayer *layer in _layerArr) { + + [layer removeFromSuperlayer]; + } + [self showAnimation]; +} + +/** + * ������Y������������������ + */ +- (void)updateYScale +{ + switch (_lineChartQuadrantType) + { + case JHLineChartQuadrantTypeFirstAndFouthQuardrant: + { + + NSInteger max = 0; + NSInteger min = 0; + + for (NSArray *arr in _valueArr) { + for (NSString * numer in arr) { + NSInteger i = [numer integerValue]; + if (i>=max) { + max = i; + } + if (i<=min) { + min = i; + } + } + + } + + min = labs(min); + max = (min<max?(max):(min)); + if (max%5==0) { + max = max; + }else + max = (max/5+1)*5; + NSMutableArray *arr = [NSMutableArray array]; + NSMutableArray *minArr = [NSMutableArray array]; + if (max<=5) { + for (NSInteger i = 0; i<5; i++) { + + [arr addObject:[NSString stringWithFormat:@"%ld",(i+1)*1]]; + [minArr addObject:[NSString stringWithFormat:@"-%ld",(i+1)*1]]; + } + } + + if (max<=10&&max>5) { + + + for (NSInteger i = 0; i<5; i++) { + + [arr addObject:[NSString stringWithFormat:@"%ld",(i+1)*2]]; + [minArr addObject:[NSString stringWithFormat:@"-%ld",(i+1)*2]]; + + } + + }else if(max>10&&max<=100){ + + + for (NSInteger i = 0; i<max/5; i++) { + [arr addObject:[NSString stringWithFormat:@"%ld",(i+1)*5]]; + [minArr addObject:[NSString stringWithFormat:@"-%ld",(i+1)*5]]; + } + + }else{ + + NSInteger count = max / 10; + + for (NSInteger i = 0; i<11; i++) { + [arr addObject:[NSString stringWithFormat:@"%ld",(i+1)*count]]; + [minArr addObject:[NSString stringWithFormat:@"-%ld",(i+1)*count]]; + } + + } + + + + _yLineDataArr = @[[arr copy],[minArr copy]]; + + + [self setNeedsDisplay]; + + + }break; + case JHLineChartQuadrantTypeAllQuardrant:{ + + NSInteger max = 0; + NSInteger min = 0; + + + for (NSArray *arr in _valueArr) + { + for (NSString * numer in arr) + { + NSInteger i = [numer integerValue]; + if (i>=max) { + max = i; + } + if (i<=min) { + min = i; + } + } + + } + + + min = labs(min); + max = (min<max?(max):(min)); + if (max%5==0) { + max = max; + }else + max = (max/5+1)*5; + NSMutableArray *arr = [NSMutableArray array]; + NSMutableArray *minArr = [NSMutableArray array]; + if (max<=5) { + for (NSInteger i = 0; i<5; i++) { + + [arr addObject:[NSString stringWithFormat:@"%ld",(i+1)*1]]; + [minArr addObject:[NSString stringWithFormat:@"-%ld",(i+1)*1]]; + } + } + + if (max<=10&&max>5) { + + + for (NSInteger i = 0; i<5; i++) { + + [arr addObject:[NSString stringWithFormat:@"%ld",(i+1)*2]]; + [minArr addObject:[NSString stringWithFormat:@"-%ld",(i+1)*2]]; + + } + + }else if(max>10&&max<=100){ + + + for (NSInteger i = 0; i<max/5; i++) { + [arr addObject:[NSString stringWithFormat:@"%ld",(i+1)*5]]; + [minArr addObject:[NSString stringWithFormat:@"-%ld",(i+1)*5]]; + } + + }else{ + + NSInteger count = max / 10; + + for (NSInteger i = 0; i<11; i++) { + [arr addObject:[NSString stringWithFormat:@"%ld",(i+1)*count]]; + [minArr addObject:[NSString stringWithFormat:@"-%ld",(i+1)*count]]; + } + + } + + _yLineDataArr = @[[arr copy],[minArr copy]]; + + [self setNeedsDisplay]; + }break; + default:{ + if (_valueArr.count) { + + NSInteger max=0; + + for (NSArray *arr in _valueArr) { + for (NSString * numer in arr) { + NSInteger i = [numer integerValue]; + if (i>=max) { + max = i; + } + + } + + } + + + if (max%5==0) { + max = max; + }else + max = (max/5+1)*5; + _yLineDataArr = nil; + NSMutableArray *arr = [NSMutableArray array]; + if (max<=5) { + for (NSInteger i = 0; i<5; i++) { + + [arr addObject:[NSString stringWithFormat:@"%ld",(i+1)*1]]; + + } + } + + if (max<=10&&max>5) { + + + for (NSInteger i = 0; i<5; i++) { + + [arr addObject:[NSString stringWithFormat:@"%ld",(i+1)*2]]; + + } + + }else if(max>10&&max<=50){ + + for (NSInteger i = 0; i<max/5+1; i++) { + [arr addObject:[NSString stringWithFormat:@"%ld",(i+1)*5]]; + + + } + + }else if(max<=100){ + + for (NSInteger i = 0; i<max/10; i++) { + [arr addObject:[NSString stringWithFormat:@"%ld",(i+1)*10]]; + + + } + + }else if(max > 100){ + + NSInteger count = max / 10; + + for (NSInteger i = 0; i<10+1; i++) { + [arr addObject:[NSString stringWithFormat:@"%ld",(i+1)*count]]; + + } + } + + + _yLineDataArr = [arr copy]; + + [self setNeedsDisplay]; + + + } + + } + break; + } + + + +} + + +/** + * ��������������������� + */ +- (void)configChartOrigin +{ + + switch (_lineChartQuadrantType) { + case JHLineChartQuadrantTypeFirstQuardrant: + { + self.chartOrigin = CGPointMake(self.contentInsets.left+6, self.frame.size.height-self.contentInsets.bottom); + } + break; + case JHLineChartQuadrantTypeFirstAndSecondQuardrant: + { + self.chartOrigin = CGPointMake(self.contentInsets.left+_xLength/2+6, CGRectGetHeight(self.frame)-self.contentInsets.bottom); + } + break; + case JHLineChartQuadrantTypeFirstAndFouthQuardrant: + { + self.chartOrigin = CGPointMake(self.contentInsets.left+6, self.contentInsets.top+_yLength/2); + } + break; + case JHLineChartQuadrantTypeAllQuardrant: + { + self.chartOrigin = CGPointMake(self.contentInsets.left+_xLength/2+6, self.contentInsets.top+_yLength/2); + } + break; + + default: + break; + } + +} + + + + +/* ������x���y��� */ +- (void)drawXAndYLineWithContext:(CGContextRef)context +{ + switch (_lineChartQuadrantType) { + case JHLineChartQuadrantTypeFirstQuardrant:{ + + [self drawLineWithContext:context andStarPoint:self.chartOrigin andEndPoint:P_M(self.contentInsets.left+_xLength, self.chartOrigin.y) andIsDottedLine:NO andColor:_xAndYLineColor]; + if (_showYLine) + { + [self drawLineWithContext:context andStarPoint:self.chartOrigin andEndPoint:P_M(self.chartOrigin.x,self.chartOrigin.y-_yLength) andIsDottedLine:NO andColor:_xAndYLineColor]; + } + + if (_xLineDataArr.count>0) + { + CGFloat xPace = (_xLength-kXandYSpaceForSuperView)/(_xLineDataArr.count-1); + + for (NSInteger i = 0; i<_xLineDataArr.count;i++ ) + { + CGPoint p = P_M(i*xPace+self.chartOrigin.x, self.chartOrigin.y); + CGFloat len = [self getTextWithWhenDrawWithText:_xLineDataArr[i]]; + if (_showYLevelLine) + { + _xLength = CGRectGetWidth(self.frame)-self.contentInsets.left-self.contentInsets.right; + + [self drawLineWithContext:context andStarPoint:p andEndPoint:P_M(self.chartOrigin.x+self.perXLen*i,self.chartOrigin.y-_yLength) andIsDottedLine:NO andColor:_xAndYLineColor]; + + } + else + [self drawLineWithContext:context andStarPoint:p andEndPoint:P_M(p.x, p.y-3) andIsDottedLine:NO andColor:_xAndYLineColor]; + + [self drawText:[NSString stringWithFormat:@"%@",_xLineDataArr[i]] andContext:context atPoint:P_M(p.x-len/2, p.y+2) WithColor:_xAndYNumberColor andFontSize:_xyFontSize]; + } + + + + } + + if (_yLineDataArr.count>0) + { + CGFloat yPace = (_yLength - kXandYSpaceForSuperView)/(_yLineDataArr.count); + for (NSInteger i = 0; i<_yLineDataArr.count; i++) + { + CGPoint p = P_M(self.chartOrigin.x, self.chartOrigin.y - (i+1)*yPace); + CGFloat len = [self getTextWithWhenDrawWithText:_yLineDataArr[i]]; + if (_showYLevelLine) + { + [self drawLineWithContext:context andStarPoint:p andEndPoint:P_M(self.contentInsets.left+_xLength, p.y) andIsDottedLine:NO andColor:_xAndYLineColor]; + + } + else + { + [self drawLineWithContext:context andStarPoint:p andEndPoint:P_M(p.x+3, p.y) andIsDottedLine:NO andColor:_xAndYLineColor]; + } + + [self drawText:[NSString stringWithFormat:@"%@",_yLineDataArr[i]] andContext:context atPoint:P_M(p.x-len-3, p.y-3) WithColor:_xAndYNumberColor andFontSize:_xyFontSize]; + } + } + + }break; + case JHLineChartQuadrantTypeFirstAndSecondQuardrant:{ + [self drawLineWithContext:context andStarPoint:P_M(self.contentInsets.left, self.chartOrigin.y) andEndPoint:P_M(self.contentInsets.left+_xLength, self.chartOrigin.y) andIsDottedLine:NO andColor:_xAndYLineColor]; + + if (_showYLine) { + [self drawLineWithContext:context andStarPoint:self.chartOrigin andEndPoint:P_M(self.chartOrigin.x,self.chartOrigin.y-_yLength) andIsDottedLine:NO andColor:_xAndYLineColor]; + } + + + + if (_xLineDataArr.count == 2) { + NSArray * rightArr = _xLineDataArr[1]; + NSArray * leftArr = _xLineDataArr[0]; + + CGFloat xPace = (_xLength/2-kXandYSpaceForSuperView)/(rightArr.count-1); + + for (NSInteger i = 0; i<rightArr.count;i++ ) { + CGPoint p = P_M(i*xPace+self.chartOrigin.x, self.chartOrigin.y); + CGFloat len = [self getTextWithWhenDrawWithText:rightArr[i]]; + [self drawLineWithContext:context andStarPoint:p andEndPoint:P_M(p.x, p.y-3) andIsDottedLine:NO andColor:_xAndYLineColor]; + + [self drawText:[NSString stringWithFormat:@"%@",rightArr[i]] andContext:context atPoint:P_M(p.x-len/2, p.y+2) WithColor:_xAndYNumberColor andFontSize:_xyFontSize]; + } + + for (NSInteger i = 0; i<leftArr.count;i++ ) { + CGPoint p = P_M(self.chartOrigin.x-(i+1)*xPace, self.chartOrigin.y); + CGFloat len = [self getTextWithWhenDrawWithText:leftArr[i]]; + + + + [self drawLineWithContext:context andStarPoint:p andEndPoint:P_M(p.x, p.y-3) andIsDottedLine:NO andColor:_xAndYLineColor]; + + + [self drawText:[NSString stringWithFormat:@"%@",leftArr[leftArr.count-1-i]] andContext:context atPoint:P_M(p.x-len/2, p.y+2) WithColor:_xAndYNumberColor andFontSize:_xyFontSize]; + } + + } + if (_yLineDataArr.count>0) + { + CGFloat yPace = (_yLength - kXandYSpaceForSuperView)/(_yLineDataArr.count); + for (NSInteger i = 0; i<_yLineDataArr.count; i++) { + CGPoint p = P_M(self.chartOrigin.x, self.chartOrigin.y - (i+1)*yPace); + CGFloat len = [self getTextWithWhenDrawWithText:_yLineDataArr[i]]; + if (_showYLevelLine) { + [self drawLineWithContext:context andStarPoint:P_M(self.contentInsets.left, p.y) andEndPoint:P_M(self.contentInsets.left+_xLength, p.y) andIsDottedLine:NO andColor:_xAndYLineColor]; + }else + [self drawLineWithContext:context andStarPoint:p andEndPoint:P_M(p.x+3, p.y) andIsDottedLine:NO andColor:_xAndYLineColor]; + [self drawText:[NSString stringWithFormat:@"%@",_yLineDataArr[i]] andContext:context atPoint:P_M(p.x-len-3, p.y-3) WithColor:_xAndYNumberColor andFontSize:_xyFontSize]; + } + } + + }break; + case JHLineChartQuadrantTypeFirstAndFouthQuardrant:{ + [self drawLineWithContext:context andStarPoint:self.chartOrigin andEndPoint:P_M(self.contentInsets.left+_xLength, self.chartOrigin.y) andIsDottedLine:NO andColor:_xAndYLineColor]; + + if (_showYLine) { + [self drawLineWithContext:context andStarPoint:P_M(self.contentInsets.left,CGRectGetHeight(self.frame)-self.contentInsets.bottom) andEndPoint:P_M(self.chartOrigin.x,self.contentInsets.top) andIsDottedLine:NO andColor:_xAndYLineColor]; + } + + if (_xLineDataArr.count>0) { + CGFloat xPace = (_xLength-kXandYSpaceForSuperView)/(_xLineDataArr.count-1); + + for (NSInteger i = 0; i<_xLineDataArr.count;i++ ) { + CGPoint p = P_M(i*xPace+self.chartOrigin.x, self.chartOrigin.y); + CGFloat len = [self getTextWithWhenDrawWithText:_xLineDataArr[i]]; + [self drawLineWithContext:context andStarPoint:p andEndPoint:P_M(p.x, p.y-3) andIsDottedLine:NO andColor:_xAndYLineColor]; + + if (i==0) { + len = -2; + } + + [self drawText:[NSString stringWithFormat:@"%@",_xLineDataArr[i]] andContext:context atPoint:P_M(p.x-len/2, p.y+2) WithColor:_xAndYNumberColor andFontSize:_xyFontSize]; + } + } + + if (_yLineDataArr.count == 2) { + + NSArray * topArr = _yLineDataArr[0]; + NSArray * bottomArr = _yLineDataArr[1]; + CGFloat yPace = (_yLength/2 - kXandYSpaceForSuperView)/([_yLineDataArr[0] count]); + _perYlen = yPace; + for (NSInteger i = 0; i<topArr.count; i++) { + CGPoint p = P_M(self.chartOrigin.x, self.chartOrigin.y - (i+1)*yPace); + CGFloat len = [self getTextWithWhenDrawWithText:topArr[i]]; + if (_showYLevelLine) { + [self drawLineWithContext:context andStarPoint:p andEndPoint:P_M(self.contentInsets.left+_xLength, p.y) andIsDottedLine:NO andColor:_xAndYLineColor]; + }else + [self drawLineWithContext:context andStarPoint:p andEndPoint:P_M(p.x+3, p.y) andIsDottedLine:NO andColor:_xAndYLineColor]; + [self drawText:[NSString stringWithFormat:@"%@",topArr[i]] andContext:context atPoint:P_M(p.x-len-3, p.y-3) WithColor:_xAndYNumberColor andFontSize:_xyFontSize]; + + } + + + for (NSInteger i = 0; i<bottomArr.count; i++) { + CGPoint p = P_M(self.chartOrigin.x, self.chartOrigin.y + (i+1)*yPace); + CGFloat len = [self getTextWithWhenDrawWithText:bottomArr[i]]; + + if (_showYLevelLine) { + [self drawLineWithContext:context andStarPoint:p andEndPoint:P_M(self.contentInsets.left+_xLength, p.y) andIsDottedLine:NO andColor:_xAndYLineColor]; + }else{ + + [self drawLineWithContext:context andStarPoint:p andEndPoint:P_M(p.x+3, p.y) andIsDottedLine:NO andColor:_xAndYLineColor]; + } + [self drawText:[NSString stringWithFormat:@"%@",bottomArr[i]] andContext:context atPoint:P_M(p.x-len-3, p.y-3) WithColor:_xAndYNumberColor andFontSize:_xyFontSize]; + } + + + } + + }break; + case JHLineChartQuadrantTypeAllQuardrant:{ + [self drawLineWithContext:context andStarPoint:P_M(self.chartOrigin.x-_xLength/2, self.chartOrigin.y) andEndPoint:P_M(self.chartOrigin.x+_xLength/2, self.chartOrigin.y) andIsDottedLine:NO andColor:_xAndYLineColor]; + + if (_showYLine) { + [self drawLineWithContext:context andStarPoint:P_M(self.chartOrigin.x,self.chartOrigin.y+_yLength/2) andEndPoint:P_M(self.chartOrigin.x,self.chartOrigin.y-_yLength/2) andIsDottedLine:NO andColor:_xAndYLineColor]; + } + + + + if (_xLineDataArr.count == 2) { + NSArray * rightArr = _xLineDataArr[1]; + NSArray * leftArr = _xLineDataArr[0]; + + CGFloat xPace = (_xLength/2-kXandYSpaceForSuperView)/(rightArr.count-1); + + for (NSInteger i = 0; i<rightArr.count;i++ ) { + CGPoint p = P_M(i*xPace+self.chartOrigin.x, self.chartOrigin.y); + CGFloat len = [self getTextWithWhenDrawWithText:rightArr[i]]; + [self drawLineWithContext:context andStarPoint:p andEndPoint:P_M(p.x, p.y-3) andIsDottedLine:NO andColor:_xAndYLineColor]; + + [self drawText:[NSString stringWithFormat:@"%@",rightArr[i]] andContext:context atPoint:P_M(p.x-len/2, p.y+2) WithColor:_xAndYNumberColor andFontSize:_xyFontSize]; + } + for (NSInteger i = 0; i<leftArr.count;i++ ) { + CGPoint p = P_M(self.chartOrigin.x-(i+1)*xPace, self.chartOrigin.y); + CGFloat len = [self getTextWithWhenDrawWithText:leftArr[i]]; + [self drawLineWithContext:context andStarPoint:p andEndPoint:P_M(p.x, p.y-3) andIsDottedLine:NO andColor:_xAndYLineColor]; + + [self drawText:[NSString stringWithFormat:@"%@",leftArr[leftArr.count-1-i]] andContext:context atPoint:P_M(p.x-len/2, p.y+2) WithColor:_xAndYNumberColor andFontSize:_xyFontSize]; + } + + } + + + if (_yLineDataArr.count == 2) { + + NSArray * topArr = _yLineDataArr[0]; + NSArray * bottomArr = _yLineDataArr[1]; + CGFloat yPace = (_yLength/2 - kXandYSpaceForSuperView)/([_yLineDataArr[0] count]); + _perYlen = yPace; + for (NSInteger i = 0; i<topArr.count; i++) { + CGPoint p = P_M(self.chartOrigin.x, self.chartOrigin.y - (i+1)*yPace); + CGFloat len = [self getTextWithWhenDrawWithText:topArr[i]]; + [self drawLineWithContext:context andStarPoint:p andEndPoint:P_M(p.x+3, p.y) andIsDottedLine:NO andColor:_xAndYLineColor]; + [self drawText:[NSString stringWithFormat:@"%@",topArr[i]] andContext:context atPoint:P_M(p.x-len-3, p.y-3) WithColor:_xAndYNumberColor andFontSize:_xyFontSize]; + + } + + + for (NSInteger i = 0; i<bottomArr.count; i++) { + CGPoint p = P_M(self.chartOrigin.x, self.chartOrigin.y + (i+1)*yPace); + CGFloat len = [self getTextWithWhenDrawWithText:bottomArr[i]]; + [self drawLineWithContext:context andStarPoint:p andEndPoint:P_M(p.x+3, p.y) andIsDottedLine:NO andColor:_xAndYLineColor]; + [self drawText:[NSString stringWithFormat:@"%@",bottomArr[i]] andContext:context atPoint:P_M(p.x-len-3, p.y-3) WithColor:_xAndYNumberColor andFontSize:_xyFontSize]; + } + + + } + + }break; + + default: + break; + } + + +} + +/** + * ������������������ + */ +-(void)showAnimation +{ + [self configPerXAndPerY]; + [self configValueDataArray]; + [self drawAnimation]; +} + + +- (void)drawRect:(CGRect)rect +{ + + + CGContextRef context = UIGraphicsGetCurrentContext(); + + [self drawXAndYLineWithContext:context]; + + + if (!_isEndAnimation) { + return; + } + + if (_drawDataArr.count) { + [self drawPositionLineWithContext:context]; + } + +} + + + +/** + * ��������������������������� + */ +- (void)configValueDataArray +{ + _drawDataArr = [NSMutableArray array]; + + if (_valueArr.count==0) { + return; + } + + switch (_lineChartQuadrantType) + { + case JHLineChartQuadrantTypeFirstQuardrant: + { + _perValue = _perYlen/[[_yLineDataArr firstObject] floatValue]; + + // ������������������ + for (NSArray *valueArr in _valueArr) + { + NSMutableArray *dataMArr = [NSMutableArray array]; + for (NSInteger i = 0; i < valueArr.count; i++) + { + + CGPoint p = P_M(i*_perXLen+self.chartOrigin.x,self.contentInsets.top + _yLength - [valueArr[i] floatValue]*_perValue); + NSValue *value = [NSValue valueWithCGPoint:p]; + [dataMArr addObject:value]; + } + [_drawDataArr addObject:[dataMArr copy]]; + + } + +// // ������������������ +// NSMutableArray *dataMArr = [NSMutableArray array]; +// for (NSInteger i = 0; i < _valueArr.count; i++) +// { +// NSString * valueStr = [_valueArr objectAtIndex:i]; +// CGPoint p = P_M(i*_perXLen+self.chartOrigin.x,self.contentInsets.top + _yLength - [valueStr floatValue]*_perValue); +// NSValue *value = [NSValue valueWithCGPoint:p]; +// [dataMArr addObject:value]; +// } +// +// [_drawDataArr addObject:[dataMArr copy]]; + + }break; + case JHLineChartQuadrantTypeFirstAndSecondQuardrant:{ + + _perValue = _perYlen/[[_yLineDataArr firstObject] floatValue]; + + + + for (NSArray *valueArr in _valueArr) { + NSMutableArray *dataMArr = [NSMutableArray array]; + + + CGPoint p ; + for (NSInteger i = 0; i<[_xLineDataArr[0] count]; i++) { + p = P_M(self.contentInsets.left + kXandYSpaceForSuperView+i*_perXLen, self.contentInsets.top + _yLength - [valueArr[i] floatValue]*_perValue); + [dataMArr addObject:[NSValue valueWithCGPoint:p]]; + } + + for (NSInteger i = 0; i<[_xLineDataArr[1] count]; i++) { + p = P_M(self.chartOrigin.x+i*_perXLen, self.contentInsets.top + _yLength - [valueArr[i+[_xLineDataArr[0] count]] floatValue]*_perValue); + [dataMArr addObject:[NSValue valueWithCGPoint:p]]; + + } + + + + [_drawDataArr addObject:[dataMArr copy]]; + + } + + + + + }break; + case JHLineChartQuadrantTypeFirstAndFouthQuardrant:{ + _perValue = _perYlen/[[_yLineDataArr[0] firstObject] floatValue]; + for (NSArray *valueArr in _valueArr) { + NSMutableArray *dataMArr = [NSMutableArray array]; + for (NSInteger i = 0; i<valueArr.count; i++) { + + CGPoint p = P_M(i*_perXLen+self.chartOrigin.x,self.chartOrigin.y - [valueArr[i] floatValue]*_perValue); + NSValue *value = [NSValue valueWithCGPoint:p]; + [dataMArr addObject:value]; + } + [_drawDataArr addObject:[dataMArr copy]]; + + } + + }break; + case JHLineChartQuadrantTypeAllQuardrant:{ + + + + _perValue = _perYlen/[[_yLineDataArr[0] firstObject] floatValue]; + for (NSArray *valueArr in _valueArr) { + NSMutableArray *dataMArr = [NSMutableArray array]; + + + CGPoint p ; + for (NSInteger i = 0; i<[_xLineDataArr[0] count]; i++) { + p = P_M(self.contentInsets.left + kXandYSpaceForSuperView+i*_perXLen, self.chartOrigin.y-[valueArr[i] floatValue]*_perValue); + [dataMArr addObject:[NSValue valueWithCGPoint:p]]; + } + + for (NSInteger i = 0; i<[_xLineDataArr[1] count]; i++) { + p = P_M(self.chartOrigin.x+i*_perXLen, self.chartOrigin.y-[valueArr[i+[_xLineDataArr[0] count]] floatValue]*_perValue); + [dataMArr addObject:[NSValue valueWithCGPoint:p]]; + + } + + + + [_drawDataArr addObject:[dataMArr copy]]; + + } + + }break; + default: + break; + } + + + +} + + +//������������ +- (void)drawAnimation +{ + + [_shapeLayer removeFromSuperlayer]; + _shapeLayer = [CAShapeLayer layer]; + + if (_drawDataArr.count==0) + { + return; + } + + //���������UIBezierPath������������ + [self configPerXAndPerY]; + + + for (NSInteger i = 0;i<_drawDataArr.count;i++) + { + + NSArray *dataArr = _drawDataArr[i]; + + [self drawPathWithDataArr:dataArr andIndex:i]; + + } + + + +} + + +- (CGPoint)centerOfFirstPoint:(CGPoint)p1 andSecondPoint:(CGPoint)p2{ + + + return P_M((p1.x + p2.x) / 2.0, (p1.y + p2.y) / 2.0); + +} + + + +- (void)drawPathWithDataArr:(NSArray *)dataArr andIndex:(NSInteger )colorIndex +{ + + UIBezierPath *firstPath = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(0, 0, 0, 0)]; + + UIBezierPath *secondPath = [UIBezierPath bezierPath]; + + for (NSInteger i = 0; i<dataArr.count; i++) + { + + NSValue *value = dataArr[i]; + + CGPoint p = value.CGPointValue; + + if (_pathCurve) + { + if (i==0) { + + if (_contentFill) + { + + [secondPath moveToPoint:P_M(p.x, self.chartOrigin.y)]; + [secondPath addLineToPoint:p]; + } + + [firstPath moveToPoint:p]; + } + else + { + CGPoint nextP = [dataArr[i-1] CGPointValue]; + CGPoint control1 = P_M(p.x + (nextP.x - p.x) / 2.0, nextP.y ); + CGPoint control2 = P_M(p.x + (nextP.x - p.x) / 2.0, p.y); + [secondPath addCurveToPoint:p controlPoint1:control1 controlPoint2:control2]; + [firstPath addCurveToPoint:p controlPoint1:control1 controlPoint2:control2]; + } + } + else + { + + if (i==0) + { + if (_contentFill) { + [secondPath moveToPoint:P_M(p.x, self.chartOrigin.y)]; + [secondPath addLineToPoint:p]; + } + [firstPath moveToPoint:p]; +// [secondPath moveToPoint:p]; + } + else + { + [firstPath addLineToPoint:p]; + [secondPath addLineToPoint:p]; + } + + } + + if (i==dataArr.count-1) { + + [secondPath addLineToPoint:P_M(p.x, self.chartOrigin.y)]; + + } + } + + + + if (_contentFill) + { + [secondPath closePath]; + } + + //���������UIBezierPath���CAShapeLayer������ + + + CAShapeLayer *shapeLayer = [CAShapeLayer layer]; + shapeLayer.frame = self.bounds; + shapeLayer.path = firstPath.CGPath; + UIColor *color = (_valueLineColorArr.count==_drawDataArr.count?(_valueLineColorArr[colorIndex]):([UIColor orangeColor])); + shapeLayer.strokeColor = color.CGColor; + shapeLayer.fillColor = [UIColor clearColor].CGColor; + shapeLayer.lineWidth = _lineWidth;//(_animationPathWidth<=0?2:_animationPathWidth); + + //��������������� + + CABasicAnimation *ani = [CABasicAnimation animationWithKeyPath:NSStringFromSelector(@selector(strokeEnd))]; + + ani.fromValue = @0; + + ani.toValue = @1; + + ani.duration = 0.0; + + ani.delegate = self; + + ani.speed = 6.0; + + [shapeLayer addAnimation:ani forKey:NSStringFromSelector(@selector(strokeEnd))]; + + [self.layer addSublayer:shapeLayer]; + [_layerArr addObject:shapeLayer]; + + + CAShapeLayer *shaperLay = [CAShapeLayer layer]; + shaperLay.frame = self.bounds; + shaperLay.path = secondPath.CGPath; + if (self.contentFillColorArr.count == self.drawDataArr.count) { + + shaperLay.fillColor = [self.contentFillColorArr[colorIndex] CGColor]; + }else{ + shaperLay.fillColor = [UIColor clearColor].CGColor; + } + + [self.layer addSublayer:shaperLay]; + [_layerArr addObject:shaperLay]; + +// delete +// weakSelf(weakSelf) +// dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(ani.duration * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ +// +// CAShapeLayer *shaperLay = [CAShapeLayer layer]; +// shaperLay.frame = weakself.bounds; +// shaperLay.path = secondPath.CGPath; +// if (weakself.contentFillColorArr.count == weakself.drawDataArr.count) { +// +// shaperLay.fillColor = [weakself.contentFillColorArr[colorIndex] CGColor]; +// }else{ +// shaperLay.fillColor = [UIColor clearColor].CGColor; +// } +// +// [weakself.layer addSublayer:shaperLay]; +// [_layerArr addObject:shaperLay]; +// }); + + +} + + + +/** + * ������������������������ + * + * @param context ��������������������� + */ +- (void)drawPositionLineWithContext:(CGContextRef)context{ + + if (_drawDataArr.count==0) { + return; + } + + + for (NSInteger m = 0;m<_valueArr.count;m++) { + NSArray *arr = _drawDataArr[m]; + + for (NSInteger i = 0 ;i<arr.count;i++ ) { + + CGPoint p = [arr[i] CGPointValue]; + UIColor *positionLineColor; + if (_positionLineColorArr.count == _valueArr.count) { + positionLineColor = _positionLineColorArr[m]; + }else + positionLineColor = [UIColor orangeColor]; + + + if (_showValueLeadingLine) { + [self drawLineWithContext:context andStarPoint:P_M(self.chartOrigin.x, p.y) andEndPoint:p andIsDottedLine:YES andColor:positionLineColor]; + [self drawLineWithContext:context andStarPoint:P_M(p.x, self.chartOrigin.y) andEndPoint:p andIsDottedLine:YES andColor:positionLineColor]; + } + + + if (p.y!=0) + { + UIColor *pointNumberColor = (_pointNumberColorArr.count == _valueArr.count?(_pointNumberColorArr[m]):([UIColor orangeColor])); + + switch (_lineChartQuadrantType) { + + + case JHLineChartQuadrantTypeFirstQuardrant: + { + //NSString *aimStr = [NSString stringWithFormat:@"(%@,%@)",_xLineDataArr[i],_valueArr[m][i]]; + NSString *aimStr = [NSString stringWithFormat:@"%@",_valueArr[m][i]]; + + CGFloat length = [self sizeOfStringWithMaxSize:CGSizeMake(100, 25) textFont:_numberFontSize aimString:aimStr].width; + [self drawText:aimStr andContext:context atPoint:P_M(p.x - length / 2+5, p.y - 15) WithColor:pointNumberColor andFontSize:_numberFontSize]; + } + break; + case JHLineChartQuadrantTypeFirstAndSecondQuardrant: + { + NSString *str = (i<[_xLineDataArr[0] count]?(_xLineDataArr[0][i]):(_xLineDataArr[1][i-[_xLineDataArr[0] count]])); + + //NSString *aimStr = [NSString stringWithFormat:@"(%@,%@)",str,_valueArr[m][i]]; + NSString *aimStr = [NSString stringWithFormat:@"%@",_valueArr[m][i]]; + + CGFloat length = [self sizeOfStringWithMaxSize:CGSizeMake(100, 25) textFont:_numberFontSize aimString:aimStr].width; + + [self drawText:aimStr andContext:context atPoint:P_M(p.x - length / 2+5, p.y - 15) WithColor:pointNumberColor andFontSize:_numberFontSize]; + } + break; + case JHLineChartQuadrantTypeFirstAndFouthQuardrant: + { + //NSString *aimStr = [NSString stringWithFormat:@"(%@,%@)",_xLineDataArr[i],_valueArr[m][i]]; + NSString *aimStr = [NSString stringWithFormat:@"%@",_valueArr[m][i]]; + + CGFloat length = [self sizeOfStringWithMaxSize:CGSizeMake(100, 25) textFont:_numberFontSize aimString:aimStr].width; + [self drawText:aimStr andContext:context atPoint:P_M(p.x - length / 2+5, p.y - 15) WithColor:pointNumberColor andFontSize:_numberFontSize]; + } + break; + case JHLineChartQuadrantTypeAllQuardrant: + { + NSString *str = (i<[_xLineDataArr[0] count]?(_xLineDataArr[0][i]):(_xLineDataArr[1][i-[_xLineDataArr[0] count]])); + + //NSString *aimStr =[NSString stringWithFormat:@"(%@,%@)",str,_valueArr[m][i]]; + NSString *aimStr =[NSString stringWithFormat:@"%@",_valueArr[m][i]]; + + CGFloat length = [self sizeOfStringWithMaxSize:CGSizeMake(100, 25) textFont:_numberFontSize aimString:aimStr].width; + + [self drawText:aimStr andContext:context atPoint:P_M(p.x - length / 2+5, p.y - 15) WithColor:pointNumberColor andFontSize:_numberFontSize]; + } + break; + + default: + break; + } + + } + + + } + } + + _isEndAnimation = NO; + + +} + + + + + +-(void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag{ + + if (flag) + { + [self drawPoint]; + } + +} + +/** + * ��������������� + */ +- (void)drawPoint +{ + + for (NSInteger m = 0;m<_drawDataArr.count;m++) + { + + NSArray *arr = _drawDataArr[m]; + for (NSInteger i = 0; i<arr.count; i++) + { + + NSValue *value = arr[i]; + + CGPoint p = value.CGPointValue; + + + UIBezierPath *pBezier = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(0, 0, 5, 5)]; + [pBezier moveToPoint:p]; + // [pBezier addArcWithCenter:p radius:13 startAngle:0 endAngle:M_PI*2 clockwise:YES]; + + CAShapeLayer *pLayer = [CAShapeLayer layer]; + pLayer.frame = CGRectMake(0, 0, 5, 5); + pLayer.position = p; + pLayer.path = pBezier.CGPath; + + UIColor *color = _pointColorArr.count==_drawDataArr.count?(_pointColorArr[m]):([UIColor orangeColor]); + + pLayer.fillColor = color.CGColor; + + CABasicAnimation *ani = [CABasicAnimation animationWithKeyPath:NSStringFromSelector(@selector(strokeEnd))]; + + ani.fromValue = @0; + + ani.toValue = @1; + + ani.duration = 0.0; + + ani.speed = 6.0; + + [pLayer addAnimation:ani forKey:NSStringFromSelector(@selector(strokeEnd))]; + + [self.layer addSublayer:pLayer]; + [_layerArr addObject:pLayer]; + + + } + + _isEndAnimation = YES; + + [self setNeedsDisplay]; + } +} + + + + + + +@end -- Gitblit v1.8.0