New file |
| | |
| | | // |
| | | // JHRadarChart.m |
| | | // JHChartDemo |
| | | // |
| | | // Created by 简豪 on 16/9/9. |
| | | // Copyright © 2016年 JH. All rights reserved. |
| | | // |
| | | |
| | | #import "JHRadarChart.h" |
| | | |
| | | @interface JHRadarChart () |
| | | |
| | | @property (nonatomic,assign)CGFloat chartRadius; |
| | | @property (nonatomic,strong)NSMutableArray * drawPointArray; |
| | | |
| | | @property (nonatomic,strong)NSMutableArray * baseDrawPointArray; |
| | | @end |
| | | |
| | | |
| | | @implementation JHRadarChart |
| | | |
| | | |
| | | -(NSMutableArray *)drawPointArray{ |
| | | |
| | | if (!_drawPointArray) { |
| | | _drawPointArray = [NSMutableArray array]; |
| | | } |
| | | |
| | | return _drawPointArray; |
| | | } |
| | | |
| | | |
| | | -(NSMutableArray *)baseDrawPointArray{ |
| | | |
| | | if (!_baseDrawPointArray) { |
| | | _baseDrawPointArray = [NSMutableArray array]; |
| | | } |
| | | return _baseDrawPointArray; |
| | | } |
| | | |
| | | -(void)setLayerCount:(NSInteger)layerCount{ |
| | | |
| | | if (layerCount<=0) { |
| | | return; |
| | | } |
| | | |
| | | _layerCount = layerCount; |
| | | |
| | | } |
| | | |
| | | -(instancetype)initWithFrame:(CGRect)frame{ |
| | | |
| | | |
| | | if (self = [super initWithFrame:frame]) { |
| | | |
| | | self.layerCount = 3; |
| | | self.chartRadius = (self.frame.size.height - 50 * 2) / 2.0; |
| | | self.chartOrigin = CGPointMake(CGRectGetWidth(self.frame) / 2.0, CGRectGetHeight(self.frame) / 2.0); |
| | | self.layerFillColor = [UIColor colorWithWhite:0.5 alpha:0.3]; |
| | | self.layerBoardColor = [UIColor colorWithWhite:0.5 alpha:0.3]; |
| | | self.speraLineColor = [UIColor whiteColor]; |
| | | self.perfectNumber = 100.0; |
| | | self.descTextFont = [UIFont systemFontOfSize:14]; |
| | | self.descTextColor = [UIColor darkGrayColor]; |
| | | } |
| | | |
| | | |
| | | return self; |
| | | |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 初始化点数组 |
| | | */ |
| | | - (void)configDrawingData{ |
| | | |
| | | |
| | | if (self.valueDataArray.count==0) { |
| | | return; |
| | | } |
| | | |
| | | |
| | | CGFloat perAngle = M_PI * 2 / self.valueDescArray.count; |
| | | for (NSInteger i = 0; i<self.valueDataArray.count; i++) { |
| | | |
| | | NSArray *valueArray = [self.valueDataArray objectAtIndex:i]; |
| | | NSMutableArray *cacheArray = [NSMutableArray array]; |
| | | |
| | | for (NSInteger j = 0; j<valueArray.count; j++) { |
| | | CGFloat value = [[valueArray objectAtIndex:j] floatValue]; |
| | | |
| | | value = (value>self.perfectNumber?self.perfectNumber:value); |
| | | |
| | | CGPoint cachePoint = CGPointMake(self.chartOrigin.x + value / self.perfectNumber * self.chartRadius * sin(j * perAngle), self.chartOrigin.y - value / self.perfectNumber * self.chartRadius * cos(j * perAngle)); |
| | | [cacheArray addObject:[NSValue valueWithCGPoint:cachePoint]]; |
| | | |
| | | } |
| | | |
| | | [self.drawPointArray addObject:[cacheArray copy]]; |
| | | |
| | | } |
| | | |
| | | } |
| | | |
| | | |
| | | - (void)configBaseViewDataArray{ |
| | | |
| | | [self.baseDrawPointArray removeAllObjects]; |
| | | CGFloat perLength = self.chartRadius / self.layerCount; |
| | | |
| | | CGFloat perAngle = M_PI * 2 / self.valueDescArray.count; |
| | | |
| | | for (NSInteger i = 0; i<self.layerCount; i++) { |
| | | |
| | | NSMutableArray *cacheArray = [NSMutableArray array]; |
| | | CGFloat cacheLength = (i+1) * perLength; |
| | | for (NSInteger j = 0; j<self.valueDescArray.count; j++) { |
| | | |
| | | CGPoint cachePoint = CGPointMake(self.chartOrigin.x + cacheLength * sin(j * perAngle) , self.chartOrigin.y - cacheLength * cos(j * perAngle)); |
| | | |
| | | // NSLog(@"-----%-----i== %ld ======%@",j * perAngle,i,NSStringFromCGPoint(cachePoint)); |
| | | NSValue *cacheValue = [NSValue valueWithCGPoint:cachePoint]; |
| | | [cacheArray addObject:cacheValue]; |
| | | |
| | | |
| | | if (i==0) { |
| | | |
| | | CGFloat width = [self sizeOfStringWithMaxSize:CGSizeMake(100, 20) textFont:self.descTextFont.pointSize aimString:self.valueDescArray[j]].width; |
| | | UILabel *cacheLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, width, 20)]; |
| | | cacheLabel.font = self.descTextFont; |
| | | cacheLabel.center = CGPointMake(self.chartOrigin.x + (self.chartRadius + width / 2 + 5) * sin(j * perAngle) ,self.chartOrigin.y - (self.chartRadius + 20 / 2 + 5) * cos(j * perAngle)); |
| | | cacheLabel.text = self.valueDescArray[j]; |
| | | cacheLabel.textColor = self.descTextColor; |
| | | [self addSubview:cacheLabel]; |
| | | } |
| | | |
| | | |
| | | } |
| | | |
| | | [self.baseDrawPointArray addObject:[cacheArray copy]]; |
| | | [cacheArray removeAllObjects]; |
| | | |
| | | } |
| | | |
| | | |
| | | |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 添加基本的视图模块 |
| | | */ |
| | | - (void)drawBaseView{ |
| | | for (NSInteger i = self.baseDrawPointArray.count-1; i>=0; i--) { |
| | | CAShapeLayer *shapeLayer = [CAShapeLayer layer]; |
| | | |
| | | UIBezierPath *path = [UIBezierPath bezierPath]; |
| | | NSArray * cacheArray = [self.baseDrawPointArray objectAtIndex:i]; |
| | | for (NSInteger j = 0; j<cacheArray.count; j++) { |
| | | |
| | | NSValue *cacheValue = [cacheArray objectAtIndex:j]; |
| | | CGPoint currentCachePoint = [cacheValue CGPointValue]; |
| | | |
| | | |
| | | NSLog(@"i== %ld ======%@",i,NSStringFromCGPoint(currentCachePoint)); |
| | | if (j==0) { |
| | | [path moveToPoint:currentCachePoint]; |
| | | }else if(j==cacheArray.count){ |
| | | [path addLineToPoint:currentCachePoint]; |
| | | [path moveToPoint:currentCachePoint]; |
| | | }else{ |
| | | [path addLineToPoint:currentCachePoint]; |
| | | } |
| | | } |
| | | |
| | | [path closePath]; |
| | | shapeLayer.path = path.CGPath; |
| | | shapeLayer.fillColor = self.layerFillColor.CGColor; |
| | | shapeLayer.strokeColor = self.layerBoardColor.CGColor; |
| | | [self.layer addSublayer:shapeLayer]; |
| | | } |
| | | |
| | | CAShapeLayer *shapeLayer = [CAShapeLayer layer]; |
| | | |
| | | UIBezierPath *path = [UIBezierPath bezierPath]; |
| | | [path closePath]; |
| | | [path moveToPoint:self.chartOrigin]; |
| | | NSMutableArray * cacheArray = [self.baseDrawPointArray lastObject]; |
| | | for (NSInteger j = 0; j<cacheArray.count; j++) { |
| | | NSValue *cacheValue = [cacheArray objectAtIndex:j]; |
| | | CGPoint currentCachePoint = [cacheValue CGPointValue]; |
| | | |
| | | [path addLineToPoint:currentCachePoint]; |
| | | [path moveToPoint:self.chartOrigin]; |
| | | } |
| | | shapeLayer.path = path.CGPath; |
| | | shapeLayer.strokeColor = self.speraLineColor.CGColor; |
| | | [self.layer addSublayer:shapeLayer]; |
| | | |
| | | |
| | | |
| | | |
| | | } |
| | | |
| | | |
| | | - (void)drawValueView{ |
| | | |
| | | |
| | | if (self.drawPointArray.count==0) { |
| | | return; |
| | | } |
| | | |
| | | |
| | | for (NSInteger i = 0 ; i<self.drawPointArray.count; i++) { |
| | | |
| | | NSArray *cacheArray = [self.drawPointArray objectAtIndex:i]; |
| | | UIBezierPath *path = [UIBezierPath bezierPath]; |
| | | for (NSInteger j = 0; j<cacheArray.count; j++) { |
| | | |
| | | |
| | | |
| | | if (j==0) { |
| | | [path moveToPoint:[[cacheArray objectAtIndex:j] CGPointValue]]; |
| | | }else{ |
| | | [path addLineToPoint:[[cacheArray objectAtIndex:j] CGPointValue]]; |
| | | } |
| | | |
| | | } |
| | | [path closePath]; |
| | | CAShapeLayer *shaper = [CAShapeLayer layer]; |
| | | shaper.path = path.CGPath; |
| | | shaper.borderWidth = 1.0; |
| | | UIColor *cacheColor = [UIColor clearColor]; |
| | | if (self.valueDrawFillColorArray.count>i) { |
| | | cacheColor = self.valueDrawFillColorArray[i]; |
| | | } |
| | | shaper.fillColor = cacheColor.CGColor; |
| | | |
| | | |
| | | if (self.valueBoardColorArray.count>i) { |
| | | cacheColor = self.valueBoardColorArray[i]; |
| | | }else{ |
| | | cacheColor = [UIColor clearColor]; |
| | | } |
| | | shaper.strokeColor = cacheColor.CGColor; |
| | | |
| | | |
| | | [self.layer addSublayer:shaper]; |
| | | |
| | | } |
| | | |
| | | |
| | | |
| | | } |
| | | |
| | | -(void)showAnimation{ |
| | | |
| | | [self configBaseViewDataArray]; |
| | | [self configDrawingData]; |
| | | [self drawBaseView]; |
| | | [self drawValueView]; |
| | | |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | @end |