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