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