| // | 
| //  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 |