| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363 |
- //
- // SalesPaymentRankChartViewController.m
- // IBOSS
- //
- // Created by guan hong hou on 2017/8/23.
- // Copyright © 2017年 elongtian. All rights reserved.
- //
- // 功能描述:销售回款排行图表控制器
- #import "SalesPaymentRankChartViewController.h"
- #import "SalesPaymentRankModel.h"
- #import "SalesPaymentRankFrame.h"
- #define kTextFont [UIFont systemFontOfSize:LabelAndTextFontOfSize]
- @interface SalesPaymentRankChartViewController (){
-
- /**
- scrollview
- */
- UIScrollView * _scroll;
- }
- @end
- @implementation SalesPaymentRankChartViewController
- #pragma mark - 公共函数
- /**
- 视图加载完成函数
- */
- - (void)viewDidLoad {
- [super viewDidLoad];
- [self initUI];
-
- }
- #pragma mark - 私有函数
- /**
- 初始化UI
- */
- - (void)initUI{
- UIView *separatorView = [UIView new];
- separatorView.frame = CGRectMake(0, 0, Screen_Width, 10);
- separatorView.backgroundColor = LineBackgroundColor;
- [self.view addSubview:separatorView];
- UILabel *lblTitle = [[UILabel alloc]init];
- lblTitle.frame = CGRectMake((Screen_Width-160)/2, CGRectGetMaxY(separatorView.frame)+5, 160, 25);
- lblTitle.text = @"销售回款排行 (单位:元)";
- lblTitle.textColor = LabelGrayTextColor;
- lblTitle.font = [UIFont systemFontOfSize:14];
- [self.view addSubview:lblTitle];
- _bottomSeparatorView = [UIView new];
- _bottomSeparatorView.frame = CGRectMake(0,CGRectGetMaxY(lblTitle.frame)+5, Screen_Width,2);
- _bottomSeparatorView.backgroundColor=LineBackgroundColor;
- [self.view addSubview:_bottomSeparatorView];
- //柱状图左间距
- _scroll = [UIScrollView new];
- _scroll.frame = self.view.bounds;
- [self.view addSubview:_scroll];
- self.view.backgroundColor = [UIColor whiteColor];
- }
- /**
- 安全区视图发生变化
- */
- -(void)viewSafeAreaInsetsDidChange{
- _scroll.frame = CGRectMake(0, 0, SCREENWIDTH, self.view.superview.frame.size.height);
- self.view.frame = CGRectMake(0, 0, SCREENWIDTH, self.view.superview.frame.size.height);
- [super viewSafeAreaInsetsDidChange];
-
- }
- /**
- 刷新数据
- */
- - (void)refreshData{
- NSRange range=NSMakeRange(0, 10);
- if(_rankList.count > 10){
- NSRange range = NSMakeRange(0, 10);
- _rankList = [_rankList subarrayWithRange:range];
- }
- Boolean flag = [self isHaveNegativeValue];
- if(flag){
- [self loadNegativeHistogram];
- }
- else{
- [self loadPositiveHistogram];
- }
- }
- /**
- 判断是否有负数
- @return <#return value description#>
- */
- - (Boolean) isHaveNegativeValue{
- Boolean flag = NO;
- for(int i = 0;i < _rankList.count;i++){
- SalesPaymentRankFrame *frame = [_rankList objectAtIndex:i];
- double backAmount = frame.paymentRankModel.paymentAmount;
- if(backAmount < 0){
- flag = true;
- break;
- }
- }
- return flag;
- }
- /**
- 绘制向右的柱状图
- @param subview
- @param frame
- */
- - (void)layerToRight:(UIView *) subview withFrame:(CGRect) frame withColor:(UIColor *) color
- {
- CGFloat x = frame.origin.x;
- CGFloat y = frame.origin.y;
- CGFloat height = frame.size.height;
- CGFloat width = frame.size.width;
- CALayer *itemLayer = [CALayer layer];
- itemLayer.frame = frame;
- itemLayer.backgroundColor = color.CGColor;
- [subview.layer addSublayer:itemLayer];
- CABasicAnimation *aniBounds = [CABasicAnimation animationWithKeyPath:@"bounds"];
- aniBounds.fromValue = [NSValue valueWithCGRect:CGRectMake(x, y, 0, height)];
- aniBounds.toValue = [NSValue valueWithCGRect:CGRectMake(x, y, CGRectGetWidth(frame), CGRectGetHeight(frame))];
- CABasicAnimation *aniPosition = [CABasicAnimation animationWithKeyPath:@"position"];
- aniPosition.fromValue = [NSValue valueWithCGPoint:CGPointMake(x, frame.size.height/2 + y)];
- aniPosition.toValue = [NSValue valueWithCGPoint:CGPointMake(x + (CGRectGetMaxX(frame)-x)/2,y + (CGRectGetMaxY(frame)-y)/2)];
-
- CAAnimationGroup *anis = [CAAnimationGroup animation];
- anis.animations = @[aniBounds,aniPosition];
- anis.duration = 1;
- anis.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
- anis.removedOnCompletion = NO;
- anis.fillMode=kCAFillModeForwards;
- [itemLayer addAnimation:anis forKey:nil];
- }
- /**
- 绘制向左的柱状图
- @param subview
- @param frame
- */
- - (void)layerToLeft:(UIView *) subview withFrame:(CGRect) frame withColor:(UIColor *) color
- {
- CGFloat x = frame.origin.x;
- CGFloat y = frame.origin.y;
- CGFloat height = frame.size.height;
- CGFloat width = frame.size.width;
- CALayer *itemLayer = [CALayer layer];
- itemLayer.frame = frame;
- itemLayer.backgroundColor = color.CGColor;
- [subview.layer addSublayer:itemLayer];
- CABasicAnimation *aniBounds = [CABasicAnimation animationWithKeyPath:@"bounds"];
- aniBounds.fromValue = [NSValue valueWithCGRect:CGRectMake(x, y, 0, height)];
- aniBounds.toValue = [NSValue valueWithCGRect:CGRectMake(x, y, CGRectGetWidth(frame), CGRectGetHeight(frame))];
- CABasicAnimation *aniPosition = [CABasicAnimation animationWithKeyPath:@"position"];
- aniPosition.toValue = [NSValue valueWithCGPoint:CGPointMake(x+ (CGRectGetMaxX(frame)-x)/2, frame.size.height/2 + y)];
- aniPosition.fromValue = [NSValue valueWithCGPoint:CGPointMake(x+width,y + (CGRectGetMaxY(frame)-y)/2)];
- CAAnimationGroup *anis = [CAAnimationGroup animation];
- anis.animations = @[aniBounds,aniPosition];
- anis.duration = 1;
- anis.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
- anis.removedOnCompletion = NO;
- anis.fillMode=kCAFillModeForwards;
- [itemLayer addAnimation:anis forKey:nil];
- }
- /**
- 刷新正向柱状图
- */
- - (void) loadPositiveHistogram{
-
- if(_histogramView!=nil){
- [_histogramView removeFromSuperview];
- }
- self.view.backgroundColor = [UIColor whiteColor];
-
- CGFloat xSpacing =30;
- //柱状图高度
- CGFloat height = 40;
- //第一个柱状图上间距
- CGFloat fySpacing = 15;
- //柱状图间距
- CGFloat ySpacing = 10;
- //柱状图内文字左间距
- CGFloat xTextSpacing = 5;
- //柱状图最大长度
- CGFloat maxWidth = SCREENWIDTH - xSpacing - 10;
- _histogramView = [[UIView alloc]initWithFrame:CGRectMake(0,CGRectGetMaxY(_bottomSeparatorView.frame),Screen_Width,[self getHistogramHeight:_rankList])];
- [_scroll addSubview:_histogramView];
- _histogramView.backgroundColor = [UIColor whiteColor];
- SalesPaymentRankFrame *maxBackFrame= [_rankList objectAtIndex:0];
- double maxBackAmount=maxBackFrame.paymentRankModel.paymentAmount ;
- for(int i=0;i<_rankList.count;i++){
- SalesPaymentRankFrame *frame= [_rankList objectAtIndex:i];
- double backAmount= frame.paymentRankModel.paymentAmount;
- NSString *objectName= frame.paymentRankModel.objectName;
- CGFloat width;
- if(backAmount<maxBackAmount){
- width=maxWidth*(fabs(backAmount)/maxBackAmount);
- if(width<1){
- width=1;
- }
- }
- else{
- width=maxWidth;
- }
-
- [self layerToRight:_histogramView withFrame:CGRectMake(xSpacing, fySpacing*(i+1)+height*i,width, height)withColor:[UIColor colorWithRed:96.0/255.0 green:159.0/255.0 blue:233.0/255.0 alpha:1]];
- [self.view addSubview:_histogramView];
- UILabel *lblOrderSort = [[UILabel alloc] init];
- NSString *orderSortStr =[NSString stringWithFormat:@"%ld", (long)frame.paymentRankModel.orderSort];
- CGRect orderSortFrame = [orderSortStr textRectWithSize:CGSizeMake(MAXFLOAT, MAXFLOAT) attributes:@{NSFontAttributeName:kTextFont}];
-
- orderSortFrame.origin.x=10;
- orderSortFrame.origin.y=(height - orderSortFrame.size.height)/2 + fySpacing*(i+1)+height*i;
- lblOrderSort.frame=orderSortFrame;
- lblOrderSort.font = kTextFont;
- lblOrderSort.text = orderSortStr;
- [_histogramView addSubview:lblOrderSort];
- UILabel *lblDepartmentName = [[UILabel alloc] init];
- NSString *departmentNameStr =frame.paymentRankModel.objectName;
- CGRect departmentNameFrame = [departmentNameStr textRectWithSize:CGSizeMake(MAXFLOAT, MAXFLOAT) attributes:@{NSFontAttributeName:kTextFont}];
- departmentNameFrame.origin.x = xTextSpacing + xSpacing;
- departmentNameFrame.origin.y = 5+ fySpacing*(i+1)+height*i;
- lblDepartmentName.textAlignment = NSTextAlignmentRight;
- lblDepartmentName.frame=departmentNameFrame;
- lblDepartmentName.font = kTextFont;
- lblDepartmentName.text = departmentNameStr;
- [_histogramView addSubview:lblDepartmentName];
- UILabel *lblBackAmount = [[UILabel alloc] init];
- NSString *backAmountStr = [NSString stringWithFormat:@"¥%.2f", frame.paymentRankModel.paymentAmount];
- CGRect backAmountFrame = [backAmountStr textRectWithSize:CGSizeMake(MAXFLOAT, MAXFLOAT) attributes:@{NSFontAttributeName:kTextFont}];
- backAmountFrame.origin.x = xTextSpacing + xSpacing;
- backAmountFrame.origin.y = CGRectGetMaxY(lblDepartmentName.frame);
- lblBackAmount.textAlignment = NSTextAlignmentRight;
- lblBackAmount.frame=backAmountFrame;
- lblBackAmount.font = kTextFont;
- lblBackAmount.text = backAmountStr;
- [_histogramView addSubview:lblBackAmount];
- }
-
- _scroll.contentSize = CGSizeMake(self.view.frame.size.width, CGRectGetMaxY(_histogramView.frame)+10+rectStatusHeight+rectNavHeight + 150);
- [_scroll addSubview:_histogramView];
-
- }
- /**
- 刷新反向柱状图
- */
- - (void) loadNegativeHistogram{
- if(_histogramView != nil){
- [_histogramView removeFromSuperview];
- }
- //柱状图左间距
- CGFloat xSpacing = 15;
- //柱状图高度
- CGFloat height = 40;
- //第一个柱状图上间距
- CGFloat fySpacing =15;
- //柱状图间距
- CGFloat ySpacing = 10;
- //柱状图内文字左间距
- CGFloat xTextSpacing = 5;
- //柱状图最大长度
- CGFloat maxWidth = SCREENWIDTH/2 - xSpacing - 10;
- _histogramView = [[UIView alloc]initWithFrame:CGRectMake(0,CGRectGetMaxY(_bottomSeparatorView.frame),Screen_Width,[self getHistogramHeight:_rankList])];
- [_scroll addSubview:_histogramView];
- _histogramView.backgroundColor = [UIColor whiteColor];
- SalesPaymentRankFrame *maxBackFrame = [_rankList objectAtIndex:0];
- double maxBackAmount = maxBackFrame.paymentRankModel.paymentAmount;
- for(int i=0;i<_rankList.count;i++){
- SalesPaymentRankFrame *frame = [_rankList objectAtIndex:i];
- double backAmount = frame.paymentRankModel.paymentAmount;
- NSString *objectName = frame.paymentRankModel.objectName;
- CGFloat width;
- if(backAmount<maxBackAmount){
- width = maxWidth*(fabs(backAmount)/maxBackAmount);
- if(width < 1){
- width = 1;
- }
- }
- else{
- width=maxWidth;
- }
-
-
- UILabel *lblBackAmount = [[UILabel alloc] init];
- NSString *backAmountStr = [NSString stringWithFormat:@"¥%.2f",frame.paymentRankModel.paymentAmount];
- CGRect backAmountFrame = [backAmountStr textRectWithSize:CGSizeMake(MAXFLOAT, MAXFLOAT) attributes:@{NSFontAttributeName:kTextFont}];
-
-
- UILabel *lblOrderSort = [[UILabel alloc] init];
- NSString *orderSortStr = [NSString stringWithFormat:@"%ld",(long)frame.paymentRankModel.orderSort];
- CGRect orderSortFrame = [orderSortStr textRectWithSize:CGSizeMake(MAXFLOAT, MAXFLOAT) attributes:@{NSFontAttributeName:kTextFont}];
-
-
- UILabel *lblDepartmentName = [[UILabel alloc] init];
- NSString *objectNameStr =[frame.paymentRankModel objectName];
- CGRect objectNameFrame = [objectNameStr textRectWithSize:CGSizeMake(MAXFLOAT, MAXFLOAT) attributes:@{NSFontAttributeName:kTextFont}];
- if(backAmount>=0){
- [self layerToRight:_histogramView withFrame:CGRectMake(Screen_Width/2, fySpacing*(i+1)+height*i,width, height)withColor:[UIColor colorWithRed:96.0/255.0 green:159.0/255.0 blue:233.0/255.0 alpha:1]];
- objectNameFrame.origin.x = xTextSpacing+Screen_Width/2;
- objectNameFrame.origin.y = 5 + fySpacing*(i+1)+height*i;
- backAmountFrame.origin.x = xTextSpacing+Screen_Width/2;
- backAmountFrame.origin.y = CGRectGetMaxY(objectNameFrame);
- orderSortFrame.origin.x = Screen_Width/2-xSpacing;
- orderSortFrame.origin.y = (height - orderSortFrame.size.height)/2 + fySpacing*(i+1)+height*i;
- }
- else if(backAmount < 0){
- [self layerToLeft:_histogramView withFrame:CGRectMake(Screen_Width/2-width, fySpacing*(i+1)+height*i,width, height)withColor:[UIColor colorWithRed:96.0/255.0 green:159.0/255.0 blue:233.0/255.0 alpha:1]];
- objectNameFrame.origin.x = Screen_Width/2-xTextSpacing-CGRectGetWidth(objectNameFrame);
- objectNameFrame.origin.y = 5 + fySpacing*(i+1)+height*i;
- backAmountFrame.origin.x = Screen_Width/2-xTextSpacing-CGRectGetWidth(backAmountFrame);
- backAmountFrame.origin.y = CGRectGetMaxY(objectNameFrame);
- orderSortFrame.origin.x =Screen_Width/2+xTextSpacing;
- orderSortFrame.origin.y = (height - orderSortFrame.size.height)/2 + fySpacing*(i+1)+height*i;
-
- }
- [self.view addSubview:_histogramView];
- UIView *yAxis=[[UIView alloc]init];
- yAxis.frame=CGRectMake(Screen_Width/2, 0, 2.5, [self getHistogramHeight:_rankList]);
- yAxis.backgroundColor=LineBackgroundColor;
- [_histogramView addSubview:yAxis];
- lblDepartmentName.frame = objectNameFrame;
- lblDepartmentName.font = kTextFont;
- lblDepartmentName.text = objectNameStr;
- [_histogramView addSubview:lblDepartmentName];
- lblOrderSort.frame = orderSortFrame;
- lblOrderSort.font = kTextFont;
- lblOrderSort.text = orderSortStr;
- [_histogramView addSubview:lblOrderSort];
-
- lblBackAmount.textAlignment = NSTextAlignmentRight;
- lblBackAmount.frame = backAmountFrame;
- lblBackAmount.font = kTextFont;
- lblBackAmount.text = backAmountStr;
- [_histogramView addSubview:lblBackAmount];
- }
-
- _scroll.contentSize = CGSizeMake(self.view.frame.size.width, CGRectGetMaxY(_histogramView.frame)+10+rectStatusHeight+rectNavHeight + 150);
- [_scroll addSubview:_histogramView];
-
- }
- /**
- 计算柱状图的高度
- @param dataList <#dataList description#>
- @return <#return value description#>
- */
- -(CGFloat)getHistogramHeight:(NSArray*)dataList{
- // 上下间隔已经在frame上做了
- NSInteger row = dataList.count;
- return (row * 40 + (row * 15));
- }
- @end
|