单军华
2018-07-12 3e8437ae559487362fae3525beb79c534c213a51
screendisplay/screendisplay/Classes/ThirdClass/JHChart/JHColumnChart.m
New file
@@ -0,0 +1,396 @@
//
//  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