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