New file |
| | |
| | | // |
| | | // JHColumnChart.m |
| | | // JHChartDemo |
| | | // |
| | | // Created by cjatech-简豪 on 16/5/10. |
| | | // Copyright © 2016年 JH. All rights reserved. |
| | | // |
| | | |
| | | #import "JHColumnChart.h" |
| | | |
| | | @interface JHColumnChart () |
| | | |
| | | //背景图 |
| | | @property (nonatomic,strong)UIScrollView *BGScrollView; |
| | | |
| | | //峰值 |
| | | @property (nonatomic,assign) CGFloat maxHeight; |
| | | |
| | | //横向最大值 |
| | | @property (nonatomic,assign) CGFloat maxWidth; |
| | | |
| | | //Y轴辅助线数据源 |
| | | @property (nonatomic,strong)NSMutableArray * yLineDataArr; |
| | | |
| | | //所有的图层数组 |
| | | @property (nonatomic,strong)NSMutableArray * layerArr; |
| | | |
| | | //所有的柱状图数组 |
| | | @property (nonatomic,strong)NSMutableArray * showViewArr; |
| | | |
| | | @property (nonatomic,assign) CGFloat perHeight; |
| | | @end |
| | | |
| | | @implementation JHColumnChart |
| | | |
| | | |
| | | -(NSMutableArray *)showViewArr{ |
| | | |
| | | |
| | | if (!_showViewArr) { |
| | | _showViewArr = [NSMutableArray array]; |
| | | } |
| | | |
| | | return _showViewArr; |
| | | |
| | | } |
| | | |
| | | -(NSMutableArray *)layerArr{ |
| | | |
| | | |
| | | if (!_layerArr) { |
| | | _layerArr = [NSMutableArray array]; |
| | | } |
| | | |
| | | return _layerArr; |
| | | } |
| | | |
| | | |
| | | -(UIScrollView *)BGScrollView{ |
| | | |
| | | |
| | | if (!_BGScrollView) { |
| | | |
| | | _BGScrollView = [[UIScrollView alloc] initWithFrame:self.bounds]; |
| | | _BGScrollView.showsHorizontalScrollIndicator = NO; |
| | | _bgVewBackgoundColor = _bgVewBackgoundColor; |
| | | [self addSubview:_BGScrollView]; |
| | | |
| | | } |
| | | |
| | | return _BGScrollView; |
| | | |
| | | |
| | | } |
| | | |
| | | |
| | | -(void)setBgVewBackgoundColor:(UIColor *)bgVewBackgoundColor{ |
| | | |
| | | _bgVewBackgoundColor = bgVewBackgoundColor; |
| | | self.BGScrollView.backgroundColor = _bgVewBackgoundColor; |
| | | |
| | | } |
| | | |
| | | |
| | | -(NSMutableArray *)yLineDataArr{ |
| | | |
| | | |
| | | if (!_yLineDataArr) { |
| | | _yLineDataArr = [NSMutableArray array]; |
| | | } |
| | | return _yLineDataArr; |
| | | |
| | | } |
| | | |
| | | |
| | | -(instancetype)initWithFrame:(CGRect)frame{ |
| | | |
| | | |
| | | if (self = [super initWithFrame:frame]) { |
| | | |
| | | _needXandYLine = YES; |
| | | |
| | | |
| | | } |
| | | return self; |
| | | |
| | | } |
| | | |
| | | |
| | | -(void)setValueArr:(NSArray<NSArray *> *)valueArr{ |
| | | |
| | | |
| | | _valueArr = valueArr; |
| | | CGFloat max = 0; |
| | | |
| | | for (NSArray *arr in _valueArr) { |
| | | |
| | | for (id number in arr) { |
| | | |
| | | CGFloat currentNumber = [NSString stringWithFormat:@"%@",number].floatValue; |
| | | if (currentNumber>max) { |
| | | max = currentNumber; |
| | | } |
| | | |
| | | } |
| | | |
| | | } |
| | | |
| | | if (max<5.0) { |
| | | _maxHeight = 5.0; |
| | | }else if(max<10){ |
| | | _maxHeight = 10; |
| | | }else{ |
| | | _maxHeight = max; |
| | | } |
| | | |
| | | _maxHeight += 4; |
| | | _perHeight = (CGRectGetHeight(self.frame) - 20 - _originSize.y)/_maxHeight; |
| | | |
| | | |
| | | } |
| | | |
| | | |
| | | -(void)showAnimation{ |
| | | |
| | | |
| | | |
| | | [self clear]; |
| | | |
| | | _columnWidth = (_columnWidth<=0?30:_columnWidth); |
| | | NSInteger count = _valueArr.count * [_valueArr[0] count]; |
| | | _typeSpace = (_typeSpace<=0?15:_typeSpace); |
| | | _maxWidth = count * _columnWidth + _valueArr.count * _typeSpace + _typeSpace + 40; |
| | | self.BGScrollView.contentSize = CGSizeMake(_maxWidth, 0); |
| | | self.BGScrollView.backgroundColor = _bgVewBackgoundColor; |
| | | |
| | | |
| | | /* 绘制X、Y轴 可以在此改动X、Y轴字体大小 */ |
| | | if (_needXandYLine) { |
| | | |
| | | CAShapeLayer *layer = [CAShapeLayer layer]; |
| | | |
| | | [self.layerArr addObject:layer]; |
| | | |
| | | UIBezierPath *bezier = [UIBezierPath bezierPath]; |
| | | |
| | | [bezier moveToPoint:CGPointMake(self.originSize.x, CGRectGetHeight(self.frame) - self.originSize.y)]; |
| | | |
| | | [bezier addLineToPoint:P_M(self.originSize.x, 20)]; |
| | | |
| | | |
| | | [bezier moveToPoint:CGPointMake(self.originSize.x, CGRectGetHeight(self.frame) - self.originSize.y)]; |
| | | |
| | | [bezier addLineToPoint:P_M(_maxWidth , CGRectGetHeight(self.frame) - self.originSize.y)]; |
| | | |
| | | |
| | | layer.path = bezier.CGPath; |
| | | |
| | | layer.strokeColor = (_colorForXYLine==nil?([UIColor blackColor].CGColor):_colorForXYLine.CGColor); |
| | | |
| | | |
| | | CABasicAnimation *basic = [CABasicAnimation animationWithKeyPath:@"strokeEnd"]; |
| | | |
| | | |
| | | basic.duration = 1.5; |
| | | |
| | | basic.fromValue = @(0); |
| | | |
| | | basic.toValue = @(1); |
| | | |
| | | basic.autoreverses = NO; |
| | | |
| | | basic.fillMode = kCAFillModeForwards; |
| | | |
| | | |
| | | [layer addAnimation:basic forKey:nil]; |
| | | |
| | | [self.BGScrollView.layer addSublayer:layer]; |
| | | |
| | | // _maxHeight += 4; |
| | | |
| | | /* 设置虚线辅助线 */ |
| | | UIBezierPath *second = [UIBezierPath bezierPath]; |
| | | for (NSInteger i = 0; i<5; i++) { |
| | | NSInteger pace = (_maxHeight) / 5; |
| | | CGFloat height = _perHeight * (i+1)*pace; |
| | | [second moveToPoint:P_M(_originSize.x, CGRectGetHeight(self.frame) - _originSize.y -height)]; |
| | | [second addLineToPoint:P_M(_maxWidth, CGRectGetHeight(self.frame) - _originSize.y - height)]; |
| | | |
| | | |
| | | |
| | | CATextLayer *textLayer = [CATextLayer layer]; |
| | | |
| | | textLayer.contentsScale = [UIScreen mainScreen].scale; |
| | | NSString *text =[NSString stringWithFormat:@"%ld",(i + 1) * pace]; |
| | | CGFloat be = [self getTextWithWhenDrawWithText:text]; |
| | | textLayer.frame = CGRectMake(self.originSize.x - be - 3, CGRectGetHeight(self.frame) - _originSize.y -height - 5, be, 15); |
| | | |
| | | UIFont *font = [UIFont systemFontOfSize:7]; |
| | | CFStringRef fontName = (__bridge CFStringRef)font.fontName; |
| | | CGFontRef fontRef = CGFontCreateWithFontName(fontName); |
| | | textLayer.font = fontRef; |
| | | textLayer.fontSize = font.pointSize; |
| | | CGFontRelease(fontRef); |
| | | |
| | | textLayer.string = text; |
| | | textLayer.foregroundColor = (_drawTextColorForX_Y==nil?[UIColor blackColor].CGColor:_drawTextColorForX_Y.CGColor); |
| | | [_BGScrollView.layer addSublayer:textLayer]; |
| | | [self.layerArr addObject:textLayer]; |
| | | |
| | | } |
| | | |
| | | CAShapeLayer *shapeLayer = [CAShapeLayer layer]; |
| | | |
| | | shapeLayer.path = second.CGPath; |
| | | |
| | | shapeLayer.strokeColor = (_dashColor==nil?([UIColor greenColor].CGColor):_dashColor.CGColor); |
| | | |
| | | shapeLayer.lineWidth = 0.5; |
| | | |
| | | [shapeLayer setLineDashPattern:@[@(3),@(3)]]; |
| | | |
| | | CABasicAnimation *basic2 = [CABasicAnimation animationWithKeyPath:@"strokeEnd"]; |
| | | |
| | | |
| | | basic2.duration = 1.5; |
| | | |
| | | basic2.fromValue = @(0); |
| | | |
| | | basic2.toValue = @(1); |
| | | |
| | | basic2.autoreverses = NO; |
| | | |
| | | |
| | | |
| | | basic2.fillMode = kCAFillModeForwards; |
| | | |
| | | [shapeLayer addAnimation:basic2 forKey:nil]; |
| | | |
| | | [self.BGScrollView.layer addSublayer:shapeLayer]; |
| | | [self.layerArr addObject:shapeLayer]; |
| | | |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | /* 绘制X轴提示语 不管是否设置了是否绘制X、Y轴 提示语都应有 */ |
| | | if (_xShowInfoText.count == _valueArr.count&&_xShowInfoText.count>0) { |
| | | |
| | | NSInteger count = [_valueArr[0] count]; |
| | | |
| | | for (NSInteger i = 0; i<_xShowInfoText.count; i++) { |
| | | |
| | | |
| | | |
| | | CATextLayer *textLayer = [CATextLayer layer]; |
| | | |
| | | CGFloat wid = count * _columnWidth; |
| | | |
| | | |
| | | |
| | | CGSize size = [_xShowInfoText[i] boundingRectWithSize:CGSizeMake(wid, MAXFLOAT) options:NSStringDrawingUsesFontLeading|NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingTruncatesLastVisibleLine attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:9]} context:nil].size; |
| | | |
| | | textLayer.frame = CGRectMake( i * (count * _columnWidth + _typeSpace) + _typeSpace + _originSize.x, CGRectGetHeight(self.frame) - _originSize.y+5,wid, size.height); |
| | | textLayer.string = _xShowInfoText[i]; |
| | | textLayer.contentsScale = [UIScreen mainScreen].scale; |
| | | UIFont *font = [UIFont systemFontOfSize:9]; |
| | | |
| | | |
| | | |
| | | textLayer.fontSize = font.pointSize; |
| | | |
| | | textLayer.foregroundColor = _drawTextColorForX_Y.CGColor; |
| | | |
| | | textLayer.alignmentMode = kCAAlignmentCenter; |
| | | |
| | | [_BGScrollView.layer addSublayer:textLayer]; |
| | | |
| | | [self.layerArr addObject:textLayer]; |
| | | |
| | | |
| | | } |
| | | |
| | | |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | /* 动画展示 */ |
| | | for (NSInteger i = 0; i<_valueArr.count; i++) { |
| | | |
| | | |
| | | NSArray *arr = _valueArr[i]; |
| | | |
| | | for (NSInteger j = 0; j<arr.count; j++) { |
| | | |
| | | |
| | | CGFloat height =[arr[j] floatValue] *_perHeight; |
| | | |
| | | |
| | | UIView *itemsView = [UIView new]; |
| | | [self.showViewArr addObject:itemsView]; |
| | | itemsView.frame = CGRectMake((i * arr.count + j)*_columnWidth + i*_typeSpace+_originSize.x + _typeSpace, CGRectGetHeight(self.frame) - _originSize.y-1, _columnWidth, 0); |
| | | itemsView.backgroundColor = (UIColor *)(_columnBGcolorsArr.count<arr.count?[UIColor greenColor]:_columnBGcolorsArr[j]); |
| | | [UIView animateWithDuration:1 animations:^{ |
| | | |
| | | itemsView.frame = CGRectMake((i * arr.count + j)*_columnWidth + i*_typeSpace+_originSize.x + _typeSpace, CGRectGetHeight(self.frame) - height - _originSize.y -1, _columnWidth, height); |
| | | |
| | | } completion:^(BOOL finished) { |
| | | /* 动画结束后添加提示文字 */ |
| | | if (finished) { |
| | | |
| | | CATextLayer *textLayer = [CATextLayer layer]; |
| | | |
| | | [self.layerArr addObject:textLayer]; |
| | | NSString *str = [NSString stringWithFormat:@"%@",arr[j]]; |
| | | |
| | | CGSize size = [str boundingRectWithSize:CGSizeMake(_columnWidth, MAXFLOAT) options:NSStringDrawingUsesFontLeading|NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingTruncatesLastVisibleLine attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:9]} context:nil].size; |
| | | |
| | | textLayer.frame = CGRectMake((i * arr.count + j)*_columnWidth + i*_typeSpace+_originSize.x + _typeSpace, CGRectGetHeight(self.frame) - height - _originSize.y -3 - size.width, _columnWidth, size.height); |
| | | |
| | | textLayer.string = str; |
| | | |
| | | textLayer.fontSize = 9.0; |
| | | |
| | | textLayer.alignmentMode = kCAAlignmentCenter; |
| | | textLayer.contentsScale = [UIScreen mainScreen].scale; |
| | | textLayer.foregroundColor = itemsView.backgroundColor.CGColor; |
| | | |
| | | [_BGScrollView.layer addSublayer:textLayer]; |
| | | |
| | | } |
| | | |
| | | }]; |
| | | |
| | | [self.BGScrollView addSubview:itemsView]; |
| | | |
| | | |
| | | } |
| | | |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | } |
| | | |
| | | |
| | | -(void)clear{ |
| | | |
| | | |
| | | for (CALayer *lay in self.layerArr) { |
| | | [lay removeAllAnimations]; |
| | | [lay removeFromSuperlayer]; |
| | | } |
| | | |
| | | for (UIView *subV in self.showViewArr) { |
| | | [subV removeFromSuperview]; |
| | | } |
| | | |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | @end |