经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 移动开发 » iOS » 查看文章
iOS 折线图、柱状图的简单实现
来源:cnblogs  作者:纯粹的code  时间:2018/12/5 9:45:22  对本文有异议

首先我得感谢某位博主,非常抱歉,因为之前直接下载博主提供这篇文章的demo,然后去研究了,没记住博主的名字。再次非常感谢。

而这个dome我又修改了一些,完善了一些不美观的bug,当然还有,后面会陆续更新。

1 、一开始需要给坐标轴初始一个画布

  1. //初始化画布+(instancetype)initWithFrame:(CGRect)frame{//找到名称叫BezierCurveView的xib视图BezierCurveView *bezierCurveView = [[NSBundle mainBundle] loadNibNamed:@"BezierCurveView" owner:self options:nil].lastObject;
  2.     bezierCurveView.frame = frame;    //背景视图UIView *backView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, frame.size.width, frame.size.height)];
  3.     backView.backgroundColor = XYQColor(255, 229, 239);
  4.     [bezierCurveView addSubview:backView];
  5.     
  6.     myFrame = frame;return bezierCurveView;
  7. }

2、然后画坐标轴,包括x、y轴的直线、箭头、字符串的索引、路径的渲染。

  1. /**
  2.  *  画坐标轴 */-(void)drawXYLine:(NSMutableArray *)x_names AdddistanceValues:(NSInteger )adddistance StartingValues:(NSInteger)starting ProportionValuess:(NSInteger)proportion{
  3.     
  4.     UIBezierPath *path = [UIBezierPath bezierPath];    //1.Y轴、X轴的直线[path moveToPoint:CGPointMake(MARGIN+adddistance, CGRectGetHeight(myFrame)-MARGIN)];
  5.     [path addLineToPoint:CGPointMake(MARGIN+adddistance, MARGIN)];
  6.     
  7.     [path moveToPoint:CGPointMake(MARGIN+adddistance, CGRectGetHeight(myFrame)-MARGIN)];
  8.     [path addLineToPoint:CGPointMake(MARGIN+CGRectGetWidth(myFrame)-2*MARGIN+adddistance, CGRectGetHeight(myFrame)-MARGIN)];    //2.添加箭头[path moveToPoint:CGPointMake(MARGIN+adddistance, MARGIN)];
  9.     [path addLineToPoint:CGPointMake(MARGIN-5+adddistance, MARGIN+5)];
  10.     [path moveToPoint:CGPointMake(MARGIN+adddistance, MARGIN)];
  11.     [path addLineToPoint:CGPointMake(MARGIN+5+adddistance, MARGIN+5)];
  12.     
  13.     [path moveToPoint:CGPointMake(MARGIN+CGRectGetWidth(myFrame)-2*MARGIN+adddistance, CGRectGetHeight(myFrame)-MARGIN)];
  14.     [path addLineToPoint:CGPointMake(MARGIN+CGRectGetWidth(myFrame)-2*MARGIN-5+adddistance, CGRectGetHeight(myFrame)-MARGIN-5)];
  15.     [path moveToPoint:CGPointMake(MARGIN+CGRectGetWidth(myFrame)-2*MARGIN+adddistance, CGRectGetHeight(myFrame)-MARGIN)];
  16.     [path addLineToPoint:CGPointMake(MARGIN+CGRectGetWidth(myFrame)-2*MARGIN-5+adddistance, CGRectGetHeight(myFrame)-MARGIN+5)];//3.添加索引格//X轴for (int i=0; i<x_names.count; i++) {
  17.         CGFloat X = MARGIN + MARGIN*(i+1);
  18.         CGPoint point = CGPointMake(X+adddistance,CGRectGetHeight(myFrame)-MARGIN);
  19.         [path moveToPoint:point];
  20.         [path addLineToPoint:CGPointMake(point.x, point.y-3)];
  21.     }//Y轴(实际长度为200,此处比例缩小一倍使用)for (int i=0; i<11; i++) {
  22.         CGFloat Y = CGRectGetHeight(myFrame)-MARGIN-Y_EVERY_MARGIN*i;
  23.         CGPoint point = CGPointMake(MARGIN+adddistance,Y);
  24.         [path moveToPoint:point];
  25.         [path addLineToPoint:CGPointMake(point.x+3, point.y)];
  26.     }    //4.添加索引格文字//X轴for (int i=0; i<x_names.count+1; i++) {
  27.         CGFloat X = MARGIN + 15 + MARGIN*i;
  28.         UILabel *textLabel = [[UILabel alloc] initWithFrame:CGRectMake(X+adddistance, CGRectGetHeight(myFrame)-MARGIN, MARGIN, 20)];if(< x_names.count){
  29.             textLabel.text = x_names[i];
  30.         }else{
  31.             textLabel.text = @"年/月";
  32.         }
  33.         textLabel.font = [UIFont systemFontOfSize:10];
  34.         textLabel.textAlignment = NSTextAlignmentCenter;
  35.         textLabel.textColor = [UIColor blueColor];
  36.         [self addSubview:textLabel];
  37.         
  38.     }    //Y轴for (int i=0; i<11; i++) {
  39.         CGFloat Y = CGRectGetHeight(myFrame)-MARGIN-Y_EVERY_MARGIN*i;
  40.         UILabel *textLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, Y-5, MARGIN+adddistance, 10)];
  41.         textLabel.text = [NSString stringWithFormat:@"%ld",starting+proportion*10*i];
  42.         textLabel.font = [UIFont systemFontOfSize:10];
  43.         textLabel.textAlignment = NSTextAlignmentCenter;
  44.         textLabel.textColor = [UIColor redColor];
  45.         [self addSubview:textLabel];
  46.     }//5.渲染路径CAShapeLayer *shapeLayer = [CAShapeLayer layer];
  47.     shapeLayer.path = path.CGPath;
  48.     shapeLayer.strokeColor = [UIColor blackColor].CGColor;
  49.     shapeLayer.fillColor = [UIColor clearColor].CGColor;
  50.     shapeLayer.borderWidth = 2.0;
  51.     [self.subviews[0].layer addSublayer:shapeLayer];
  52. }

3、实现的方法

  1. /**
  2.  *  画折线图
  3.  *  @param x_names      x轴值的所有值名称
  4.  *  @param targetValues 所有目标值
  5.  *  @param lineType     直线类型
  6.  *  @param adddistance  y轴的字符串长度的增加距离
  7.  *  @param starting     坐标轴原点的大小数值
  8.  *  @param proportion   y轴上的数值比例差为10的倍数 */-(void)drawLineChartViewWithX_Value_Names:(NSMutableArray *)x_names TargetValues:(NSMutableArray *)targetValues LineType:(LineType) lineType AdddistanceValues:(NSInteger )adddistance  StartingValues:(NSInteger)starting ProportionValuess:(NSInteger)proportion;/**
  9.  *  画柱状图
  10.  *  @param x_names      x轴值的所有值名称
  11.  *  @param targetValues 所有目标值
  12.  *  @param adddistance  y轴的字符串长度的增加距离
  13.  *  @param starting     坐标轴原点的大小数值
  14.  *  @param proportion   y轴上的数值比例差为10的倍数 */-(void)drawBarChartViewWithX_Value_Names:(NSMutableArray *)x_names TargetValues:(NSMutableArray *)targetValues AdddistanceValues:(NSInteger )adddistance  StartingValues:(NSInteger)starting ProportionValuess:(NSInteger)proportion;

4、折线图的实现

  1. /**
  2.  *  画折线图 */-(void)drawLineChartViewWithX_Value_Names:(NSMutableArray *)x_names TargetValues:(NSMutableArray *)targetValues LineType:(LineType) lineType AdddistanceValues:(NSInteger )adddistance  StartingValues:(NSInteger)starting ProportionValuess:(NSInteger)proportion{    //1.画坐标轴    [self drawXYLine:x_names AdddistanceValues:adddistance StartingValues:starting ProportionValuess:proportion];
  3.     NSMutableArray * targetValues1 =[[NSMutableArray alloc]init];for (int i=0; i<targetValues.count; i++  ){
  4.         CGFloat coed =[targetValues[i] integerValue];
  5.         [targetValues1 addObject:@((coed-starting)/proportion)];
  6.  
  7.     }   //2.获取目标值点坐标NSMutableArray *allPoints = [NSMutableArray array];for (int i=0; i<targetValues1.count; i++) {
  8.         CGFloat doubleValue = 2*[targetValues1[i] floatValue]; //目标值放大两倍CGFloat X = MARGIN+adddistance + MARGIN*(i+1);
  9.         CGFloat Y = CGRectGetHeight(myFrame)-MARGIN-doubleValue;
  10.         CGPoint point = CGPointMake(X,Y);
  11.         UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(point.x-1, point.y-1, 2.5, 2.5) cornerRadius:2.5];
  12.         CAShapeLayer *layer = [CAShapeLayer layer];
  13.         layer.strokeColor = [UIColor purpleColor].CGColor;
  14.         layer.fillColor = [UIColor purpleColor].CGColor;
  15.         layer.path = path.CGPath;
  16.         [self.subviews[0].layer addSublayer:layer];
  17.         [allPoints addObject:[NSValue valueWithCGPoint:point]];
  18.     }//3.坐标连线UIBezierPath *path = [UIBezierPath bezierPath];
  19.     [path moveToPoint:[allPoints[0] CGPointValue]];
  20.     CGPoint PrePonit;switch (lineType) {case LineType_Straight: //直线for (int i =1; i<allPoints.count; i++) {
  21.                 CGPoint point = [allPoints[i] CGPointValue];
  22.                 [path addLineToPoint:point];
  23.             }break;case LineType_Curve:   //曲线for (int i =0; i<allPoints.count; i++) {if (i==0) {
  24.                     PrePonit = [allPoints[0] CGPointValue];
  25.                 }else{
  26.                     CGPoint NowPoint = [allPoints[i] CGPointValue];
  27.                     [path addCurveToPoint:NowPoint controlPoint1:CGPointMake((PrePonit.x+NowPoint.x)/2, PrePonit.y) controlPoint2:CGPointMake((PrePonit.x+NowPoint.x)/2, NowPoint.y)]; //三次曲线PrePonit = NowPoint;
  28.                 }
  29.             }break;
  30.     }
  31.     CAShapeLayer *shapeLayer = [CAShapeLayer layer];
  32.     shapeLayer.path = path.CGPath;
  33.     shapeLayer.strokeColor = [UIColor greenColor].CGColor;
  34.     shapeLayer.fillColor = [UIColor clearColor].CGColor;
  35.     shapeLayer.borderWidth = 2.0;
  36.     [self.subviews[0].layer addSublayer:shapeLayer];    //4.添加目标值文字for (int i =0; i<allPoints.count; i++) {
  37.         UILabel *label = [[UILabel alloc] init];
  38.         label.textColor = [UIColor purpleColor];
  39.         label.textAlignment = NSTextAlignmentCenter;
  40.         label.font = [UIFont systemFontOfSize:10];
  41.         [self.subviews[0] addSubview:label];        if (i==0) {
  42.             CGPoint NowPoint = [allPoints[0] CGPointValue];
  43.             label.text = [NSString stringWithFormat:@"%.0lf",starting+proportion*(CGRectGetHeight(myFrame)-NowPoint.y-MARGIN)/2];
  44.             label.frame = CGRectMake(NowPoint.x-MARGIN/2, NowPoint.y-20, MARGIN+adddistance, 20);
  45.             PrePonit = NowPoint;
  46.         }else{
  47.             CGPoint NowPoint = [allPoints[i] CGPointValue];if (NowPoint.y<PrePonit.y) {  //文字置于点上方label.frame = CGRectMake(NowPoint.x-MARGIN/2, NowPoint.y-20, MARGIN+adddistance, 20);
  48.             }else{ //文字置于点下方label.frame = CGRectMake(NowPoint.x-MARGIN/2, NowPoint.y, MARGIN+adddistance, 20);
  49.             }
  50.             
  51.             label.text = [NSString stringWithFormat:@"%.0lf",starting+proportion*(CGRectGetHeight(myFrame)-NowPoint.y-MARGIN)/2];
  52.        
  53.             PrePonit = NowPoint;
  54.         }
  55.     }
  56. }

5、柱状图的实现

  1. /**
  2.  *  画柱状图 */-(void)drawBarChartViewWithX_Value_Names:(NSMutableArray *)x_names TargetValues:(NSMutableArray *)targetValues AdddistanceValues:(NSInteger )adddistance  StartingValues:(NSInteger)starting ProportionValuess:(NSInteger)proportion{    //1.画坐标轴    
  3.     [self drawXYLine:x_names AdddistanceValues:adddistance StartingValues:starting ProportionValuess:proportion];
  4.     NSMutableArray * targetValues1 =[[NSMutableArray alloc]init];for (int i=0; i<targetValues.count; i++  ){
  5.         CGFloat coed =[targetValues[i] integerValue];
  6.         [targetValues1 addObject:@((coed-starting)/proportion)];
  7.        
  8.     }//2.每一个目标值点坐标for (int i=0; i<targetValues1.count; i++) {
  9.         CGFloat doubleValue = 2*[targetValues1[i] floatValue]; //目标值放大两倍CGFloat X = MARGIN + MARGIN*(i+1)+5;
  10.         CGFloat Y = CGRectGetHeight(myFrame)-MARGIN-doubleValue;
  11.         UIBezierPath *path = [UIBezierPath bezierPathWithRect:CGRectMake(X-MARGIN/2+adddistance, Y, MARGIN-10, doubleValue)];
  12.         CAShapeLayer *shapeLayer = [CAShapeLayer layer];
  13.         shapeLayer.path = path.CGPath;
  14.         shapeLayer.strokeColor = [UIColor clearColor].CGColor;
  15.         shapeLayer.fillColor = XYQRandomColor.CGColor;
  16.         shapeLayer.borderWidth = 2.0;
  17.         [self.subviews[0].layer addSublayer:shapeLayer];        //3.添加文字UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(X-MARGIN/2, Y-20, MARGIN-10+adddistance*2, 20)];
  18.         label.text = [NSString stringWithFormat:@"%.0lf",starting+proportion*(CGRectGetHeight(myFrame)-Y-MARGIN)/2];
  19.         label.textColor = [UIColor purpleColor];
  20.         label.textAlignment = NSTextAlignmentCenter;
  21.         label.font = [UIFont systemFontOfSize:10];
  22.         [self.subviews[0] addSubview:label];
  23.     }
  24. }

6、父视图view部分代码

  1. - (void)viewDidLoad {
  2.     [super viewDidLoad];
  3.     self.view.layer.backgroundColor=[UIColor whiteColor].CGColor;//1.初始化self.bezierView = [BezierCurveView initWithFrame:CGRectMake(20, 30, SCREEN_W-40, 280)];
  4.     self.bezierView.center = self.view.center;
  5.     [self.view addSubview:self.bezierView];//2.折线图   // [self drawLineChart];//3.柱状图  //  [self drawBaseChart];}//画折线图-(void)drawLineChart{    //直线//    [self.bezierView drawLineChartViewWithX_Value_Names:self.x_names TargetValues:self.targets LineType:LineType_Straight AdddistanceValues:20  StartingValues:120000 ProportionValuess:100];
  6.  
  7.    // [self.bezierView drawLineChartViewWithX_Value_Names:self.x_names TargetValues:self.targets LineType:LineType_Curve AdddistanceValues:10  StartingValues:50000 ProportionValuess:100];
  8.    // [self.bezierView drawLineChartViewWithX_Value_Names:self.x_names TargetValues:self.targets LineType:LineType_Curve AdddistanceValues:20  StartingValues:120000 ProportionValuess:100];
  9. }

7、iponexr演示结果图片

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号