| // | 
| //  JHPieChart.m | 
| //  JHCALayer | 
| // | 
| //  Created by cjatech-简豪 on 16/5/3. | 
| //  Copyright © 2016年 JH. All rights reserved. | 
| // | 
|   | 
| #import "JHPieChart.h" | 
| #import "JHPieItemsView.h" | 
| #import "JHPieForeBGView.h" | 
| #import "JHShowInfoView.h" | 
| #define k_COLOR_STOCK @[[UIColor colorWithRed:244/255.0 green:161/255.0 blue:100/255.0 alpha:1],[UIColor colorWithRed:87/255.0 green:255/255.0 blue:191/255.0 alpha:1],[UIColor colorWithRed:254/255.0 green:224/255.0 blue:90/255.0 alpha:1],[UIColor colorWithRed:240/255.0 green:58/255.0 blue:63/255.0 alpha:1],[UIColor colorWithRed:147/255.0 green:111/255.0 blue:255/255.0 alpha:1],[UIColor colorWithRed:255/255.0 green:255/255.0 blue:199/255.0 alpha:1],[UIColor colorWithRed:90/255.0 green:159/255.0 blue:229/255.0 alpha:1],[UIColor colorWithRed:100/255.0 green:230/255.0 blue:95/255.0 alpha:1],[UIColor colorWithRed:33/255.0 green:255/255.0 blue:255/255.0 alpha:1],[UIColor colorWithRed:249/255.0 green:110/255.0 blue:176/255.0 alpha:1],[UIColor colorWithRed:192/255.0 green:168/255.0 blue:250/255.0 alpha:1],[UIColor colorWithRed:166/255.0 green:134/255.0 blue:54/255.0 alpha:1],[UIColor colorWithRed:217/255.0 green:221/255.0 blue:228/255.0 alpha:1],[UIColor colorWithRed:99/255.0 green:106/255.0 blue:192/255.0 alpha:1]] | 
|   | 
| @interface JHPieChart () | 
|   | 
| @property (nonatomic,strong) JHPieForeBGView * pieForeView; | 
|   | 
|   | 
| @property (assign , nonatomic) NSInteger  allValueCount ; | 
|   | 
|   | 
| @property (nonatomic,strong) NSMutableArray * angleArr; | 
|   | 
|   | 
| @property (nonatomic,strong) NSMutableArray * countPreAngeleArr; | 
|   | 
|   | 
| @property (nonatomic,strong) NSMutableArray * layersArr; | 
|   | 
| @property (assign , nonatomic) NSInteger  saveIndex ; | 
|   | 
|   | 
| @property (assign , nonatomic) CGFloat  chartArcLength ; | 
|   | 
| @property (nonatomic,strong) JHShowInfoView * showInfoView; | 
| @end | 
|   | 
|   | 
| @implementation JHPieChart | 
|   | 
|   | 
| -(instancetype)init{ | 
|      | 
|     if (self = [super init]) { | 
|         _chartArcLength = 8.0; | 
|     } | 
|      | 
|     return self; | 
|      | 
| } | 
|   | 
|   | 
| -(instancetype)initWithFrame:(CGRect)frame{ | 
|      | 
|     if (self = [super initWithFrame:frame]) { | 
|          | 
|         _chartArcLength = 8.0; | 
|     } | 
|      | 
|     return self; | 
|      | 
| } | 
|   | 
| -(void)drawRect:(CGRect)rect{ | 
|      | 
|     CGContextRef contex = UIGraphicsGetCurrentContext(); | 
|      | 
|     if (_descArr.count==_valueArr.count&&_descArr.count>0) { | 
|          | 
|         NSArray *colors = nil; | 
|          | 
|         if (_colorArr.count==_valueArr.count) { | 
|             colors = _colorArr; | 
|         }else{ | 
|             colors = k_COLOR_STOCK; | 
|         } | 
|          | 
|         for (NSInteger i = 0; i<_descArr.count; i++) { | 
|          | 
|              [self drawQuartWithColor:colors[i%colors.count] andBeginPoint:P_M(15+self.frame.size.width/2*(i%2), 20*(i/2  )+25+_chartArcLength*2) andContext:contex]; | 
|             CGFloat present = [_valueArr[i] floatValue]/_allValueCount*100; | 
|             [self drawText:[NSString stringWithFormat:@"%@ 数量:% 3ld 占比:%.1f%c",_descArr[i],[_valueArr[i] integerValue],present,'%'] andContext:contex atPoint:P_M(30+self.frame.size.width/2*(i%2), 20*(i/2  )+25+_chartArcLength*2) WithColor:[UIColor blackColor] andTextFontSize:8]; | 
|         } | 
|         | 
|          | 
|     } | 
|      | 
|      | 
| } | 
| - (void)drawText:(NSString *)text andContext:(CGContextRef )context atPoint:(CGPoint )rect WithColor:(UIColor *)color andTextFontSize:(CGFloat )fontSize{ | 
|      | 
|      | 
|     [[NSString stringWithFormat:@"%@",text] drawAtPoint:rect withAttributes:@{NSFontAttributeName:[UIFont fontWithName:@"CourierNewPSMT" size:fontSize],NSForegroundColorAttributeName:color}]; | 
|      | 
|      | 
|     [color setFill]; | 
|      | 
|     CGContextDrawPath(context, kCGPathFill); | 
|      | 
| } | 
| - (void)countAllValue{ | 
|     _allValueCount = 0; | 
|     for (NSString *obj in _valueArr) { | 
|          | 
|         _allValueCount += obj.integerValue; | 
|          | 
|     } | 
| } | 
|   | 
|   | 
| - (void)countAllAngleDataArr{ | 
|      | 
|     _angleArr = [NSMutableArray array]; | 
|     for (NSString *obj in _valueArr) { | 
|          | 
|         [_angleArr addObject:[NSNumber numberWithDouble:obj.floatValue*M_PI * 2/_allValueCount]]; | 
|          | 
|     } | 
|      | 
|     _countPreAngeleArr = [NSMutableArray array]; | 
|      | 
|     for (NSInteger i = 0; i<_angleArr.count; i++) { | 
|          | 
|         if (i==0) { | 
|              [_countPreAngeleArr addObject:[NSNumber numberWithFloat:0]]; | 
|         } | 
|         CGFloat angle = 0.0; | 
|         for (NSInteger j = 0; j<=i; j++) { | 
|              | 
|             angle += [_angleArr[j] floatValue]; | 
|              | 
|         } | 
|          | 
|         [_countPreAngeleArr addObject:[NSNumber numberWithFloat:angle]]; | 
|   | 
|          | 
|     } | 
|      | 
|      | 
|      | 
| } | 
|   | 
| -(void)showAnimation{ | 
|      | 
|   | 
|      | 
|     if (_valueArr.count>0) { | 
|          | 
|         [self countAllValue]; | 
|          | 
|         [self countAllAngleDataArr]; | 
|          | 
|         _layersArr = [NSMutableArray array]; | 
|          | 
|         CGFloat wid = self.frame.size.width-20; | 
|          | 
|         if (_descArr.count>0) { | 
|              | 
|             NSInteger i = _descArr.count/2 + _descArr.count%2; | 
|              | 
|             wid = self.frame.size.height - 10 - i*25; | 
|              | 
|         } | 
|          | 
|         _chartArcLength = wid/2; | 
|          | 
|         NSArray *colors = nil; | 
|          | 
|         if (_colorArr.count == _valueArr.count) { | 
|              | 
|             colors = _colorArr; | 
|              | 
|         }else{ | 
|              | 
|             colors = k_COLOR_STOCK; | 
|              | 
|         } | 
|          | 
|          | 
|         for (NSInteger i = 0; i<_countPreAngeleArr.count-1; i++) { | 
|              | 
|             JHPieItemsView *itemsView = [[JHPieItemsView alloc] initWithFrame:CGRectMake(10, 10, wid/2, wid/2) andBeginAngle:[_countPreAngeleArr[i] floatValue] andEndAngle:[_countPreAngeleArr[i+1] floatValue] andFillColor:colors[i%colors.count]]; | 
|              | 
|             itemsView.center = CGPointMake(self.frame.size.width/2, 10+wid/2); | 
|              | 
|             itemsView.tag = i; | 
|              | 
|             [_layersArr addObject:itemsView]; | 
|              | 
|             [self addSubview:itemsView]; | 
|              | 
|         } | 
|          | 
|         _pieForeView = [[JHPieForeBGView alloc] initWithFrame:CGRectMake(10, 10, wid,  wid)]; | 
|          | 
|         _pieForeView.center = CGPointMake(self.frame.size.width/2, 10+wid/2); | 
|          | 
|         _pieForeView.backgroundColor = [UIColor clearColor]; | 
|         if (_showInfoView==nil) { | 
|             _showInfoView = [[JHShowInfoView alloc] init]; | 
|             _showInfoView.hidden = YES; | 
|             [_pieForeView addSubview:_showInfoView]; | 
|         } | 
|         _pieForeView.select = ^(CGFloat angle,CGPoint p){ | 
|             | 
|             [self judgeWhitchOneIsNowAngle:angle andShowPoint:p]; | 
|              | 
|         }; | 
|          | 
|         [self addSubview:_pieForeView]; | 
|          | 
|     } | 
|      | 
|     [self setNeedsDisplay]; | 
|      | 
| } | 
|   | 
|   | 
| - (void)judgeWhitchOneIsNowAngle:(CGFloat )angel andShowPoint:(CGPoint)p{ | 
|      | 
|     for (NSInteger i = 0; i<_countPreAngeleArr.count-1; i++) { | 
|          | 
|         if ([_countPreAngeleArr[i+1] floatValue]>=angel) { | 
|              | 
|           | 
|              | 
|             CGFloat NOW_ANGLE = [_countPreAngeleArr[i] floatValue]+[_angleArr[i] floatValue]/2; | 
|              | 
|             CGFloat standarSpa = _positionChangeLengthWhenClick; | 
|              | 
|   | 
|              | 
|             CGFloat spa = sin(NOW_ANGLE)*standarSpa; | 
|              | 
|             CGFloat xSpa = cos(NOW_ANGLE)*standarSpa; | 
|              | 
|             JHPieItemsView *itemsView = _layersArr[i]; | 
|             | 
|             JHPieItemsView *saveItems = _layersArr[_saveIndex]; | 
|              | 
|             CGFloat wid = self.frame.size.width-20; | 
|              | 
|             if (_descArr.count>0) { | 
|                  | 
|                 NSInteger i = _descArr.count/2 + _descArr.count%2; | 
|                  | 
|                 wid = self.frame.size.height - 10 - i*25; | 
|                  | 
|             } | 
|             NSArray *colors = nil; | 
|              | 
|             if (_colorArr.count == _valueArr.count) { | 
|                  | 
|                 colors = _colorArr; | 
|                  | 
|             }else{ | 
|                  | 
|                 colors = k_COLOR_STOCK; | 
|                  | 
|             } | 
|              CGFloat present = [_valueArr[i] floatValue]/_allValueCount*100; | 
|             [UIView animateWithDuration:0.3 animations:^{ | 
|                 if (_saveIndex==i) { | 
|                      | 
|                     if (saveItems.center.x==self.frame.size.width/2) { | 
|                         _showInfoView.hidden = NO; | 
|                         itemsView.center = CGPointMake(self.frame.size.width/2+xSpa, 10+wid/2+spa); | 
|                         [_showInfoView updateFrameTo:CGRectMake(p.x, p.y, _showInfoView.frame.size.width, _showInfoView.frame.size.height) andBGColor:colors[i%colors.count] andShowContentString:[NSString stringWithFormat:@"%@ 数量:% 3ld 占比:%.1f%c",_descArr[i],[_valueArr[i] integerValue],present,'%']]; | 
| //                        _showInfoView.frame = C   GRectMake(p.x, p.y, _showInfoView.frame.size.width, _showInfoView.frame.size.height); | 
|                          | 
|                     }else{ | 
|                         _showInfoView.hidden = YES; | 
|                         saveItems.center = CGPointMake(self.frame.size.width/2, 10+wid/2); | 
|                          | 
|                     } | 
|                      | 
|                 }else{ | 
|                      | 
|                     saveItems.center = CGPointMake(self.frame.size.width/2, 10+wid/2); | 
|                     _showInfoView.hidden = NO; | 
|                     [_showInfoView updateFrameTo:CGRectMake(p.x, p.y, _showInfoView.frame.size.width, _showInfoView.frame.size.height) andBGColor:colors[i%colors.count] andShowContentString:[NSString stringWithFormat:@"%@ 数量:% 3ld 占比:%.1f%c",_descArr[i],[_valueArr[i] integerValue],present,'%']]; | 
|                     itemsView.center = CGPointMake(self.frame.size.width/2+xSpa, 10+wid/2+spa); | 
|                      | 
|                 } | 
|             }]; | 
|             | 
|              | 
|                _saveIndex = i; | 
|              | 
|             break; | 
|         } | 
|          | 
|     } | 
|      | 
|      | 
| } | 
|   | 
|   | 
|   | 
| @end |