UIBezierPath 画折线图

 效果图

实现

原理很简单,直接发代码

//创建数据
 NSMutableArray * dataArray = [[NSMutableArray alloc]init];
    for (int i=0; i<10; i++) {
        
        int a = arc4random()%150;
        [dataArray addObject:[NSNumber numberWithInt:a]];
        
    }
    
    //创建坐标轴
    CGFloat XAxisWidth = Device_Width - FIT_WIDTH(23)*2; // X宽度
    CGFloat YAxisHeight = FIT_HEIGHT(150); // Y高度
    CGPoint axisOriginPoint = CGPointMake(FIT_WIDTH(23), FIT_HEIGHT(350)); // 起始点坐标
    
    //创建路径
    UIBezierPath * bezierPath = [[UIBezierPath alloc]init];
    [bezierPath moveToPoint:CGPointMake(FIT_WIDTH(23), axisOriginPoint.y - YAxisHeight)];
    [bezierPath addLineToPoint:CGPointMake(FIT_WIDTH(23), axisOriginPoint.y)];
    [bezierPath addLineToPoint:CGPointMake(FIT_WIDTH(23) + XAxisWidth, axisOriginPoint.y)];
    
    //画坐标轴
    CAShapeLayer * XAxisShapeLayer = [[CAShapeLayer alloc]init];
    XAxisShapeLayer.path = bezierPath.CGPath;
    XAxisShapeLayer.lineWidth = 2;
    XAxisShapeLayer.lineJoin = kCALineJoinRound;
    XAxisShapeLayer.strokeColor = [UIColor lightGrayColor].CGColor;
    XAxisShapeLayer.fillColor = nil;
    [self.layer addSublayer:XAxisShapeLayer];
    [bezierPath removeAllPoints];
    
    
    //创建折线点
    for (int i=0; i<dataArray.count; i++) {
        
        //X坐标文字
        CATextLayer * textLayer = [[CATextLayer alloc]init];
        textLayer.string = [NSString stringWithFormat:@"%d",i];
        textLayer.fontSize = FIT_HEIGHT(11);
        textLayer.foregroundColor = [UIColor lightGrayColor].CGColor;
        textLayer.frame = CGRectMake(FIT_WIDTH(23)+XAxisWidth/dataArray.count * i, axisOriginPoint.y +FIT_HEIGHT(5), XAxisWidth/dataArray.count, FIT_HEIGHT(11));
        textLayer.alignmentMode = kCAAlignmentLeft;
        textLayer.contentsScale = [UIScreen mainScreen].scale; // 以屏幕适配文字,避免拉伸或者模糊
        [self.layer addSublayer:textLayer];
        
        
        //x坐标标志
        UIBezierPath * bezierPath = [[UIBezierPath alloc]init];
        [bezierPath moveToPoint:CGPointMake(FIT_HEIGHT(23) + XAxisWidth/dataArray.count * i, axisOriginPoint.y)];
        [bezierPath addLineToPoint:CGPointMake(FIT_HEIGHT(23) + XAxisWidth/dataArray.count * i, axisOriginPoint.y - FIT_HEIGHT(3))];
        CAShapeLayer * shapeLayerX = [[CAShapeLayer alloc]init];
        shapeLayerX.path = bezierPath.CGPath;
        shapeLayerX.lineWidth = 1;
        shapeLayerX.strokeColor = [UIColor lightGrayColor].CGColor;
        shapeLayerX.fillColor = nil;
        [self.layer addSublayer:shapeLayerX];
        [bezierPath removeAllPoints];
        
        
        //y坐标标志
        bezierPath = [[UIBezierPath alloc]init];
        [bezierPath moveToPoint:CGPointMake(FIT_HEIGHT(23) + XAxisWidth/dataArray.count * i, axisOriginPoint.y)];
        [bezierPath addLineToPoint:CGPointMake(FIT_HEIGHT(23) + XAxisWidth/dataArray.count * i, axisOriginPoint.y - FIT_HEIGHT(3))];
        CAShapeLayer * shapeLayerY = [[CAShapeLayer alloc]init];
        shapeLayerY.path = bezierPath.CGPath;
        shapeLayerY.lineWidth = 1;
        shapeLayerY.strokeColor = [UIColor lightGrayColor].CGColor;
        shapeLayerY.fillColor = nil;
        [self.layer addSublayer:shapeLayerY];
        [bezierPath removeAllPoints];
        
        
    }
    
    //创建数据折线
    UIBezierPath * brokenBezierPath = [[UIBezierPath alloc]init];
    CAShapeLayer * brokenShaperLayer = [[CAShapeLayer alloc]init];
    
    for (int i=0; i<dataArray.count; i++) {
        
        CGFloat height = axisOriginPoint.y - [dataArray[i] floatValue] ;
        if (i == 0) {
            [brokenBezierPath moveToPoint:CGPointMake(FIT_WIDTH(23), height)];
        }
        else
            [brokenBezierPath addLineToPoint:CGPointMake(FIT_WIDTH(23) + XAxisWidth/dataArray.count * i , height)];
        
    }
    
    brokenShaperLayer.path = brokenBezierPath.CGPath;
    brokenShaperLayer.lineWidth = 2;
    brokenShaperLayer.strokeColor = Color_248.CGColor;
    brokenShaperLayer.fillColor = nil;
    brokenShaperLayer.lineJoin = kCALineJoinRound;
    [self.layer addSublayer:brokenShaperLayer];
    
    
    
    /*
        •速度控制函数(CAMediaTimingFunction)
        1.kCAMediaTimingFunctionLinear(线性):匀速,给你一个相对静态的感觉
        2.kCAMediaTimingFunctionEaseIn(渐进):动画缓慢进入,然后加速离开
        3.kCAMediaTimingFunctionEaseOut(渐出):动画全速进入,然后减速的到达目的地
        4.kCAMediaTimingFunctionEaseInEaseOut(渐进渐出):动画缓慢的进入,中间加速,然后减速的到达目的地。这个是默认的动画行为。
    */
    
    //通过 strokeEnd 添加简单的动画效果
    CABasicAnimation * brokenAnimation = [CABasicAnimation animationWithKeyPath:@"strokeEnd"];
    brokenAnimation.fromValue = @0;
    brokenAnimation.toValue = @1;
    brokenAnimation.duration = 2;
    brokenAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
    [brokenShaperLayer addAnimation:brokenAnimation forKey:@"brokenAnimation"];


/*
 几种动画方式
    transform.scale            比例转化     @(0.8)
    transform.scale.x          宽的比例     @(0.8)
    transform.scale.y          高的比例     @(0.8)
    transform.rotation.x       围绕x轴旋转     @(M_PI)
    transform.rotation.y       围绕y轴旋转     @(M_PI)
    transform.rotation.z       围绕z轴旋转     @(M_PI)
    cornerRadius               圆角的设置     @(50)
    backgroundColor            背景颜色的变化     (id)[UIColor purpleColor].CGColor
    bounds                     大小,中心不变     [NSValue valueWithCGRect:CGRectMake(0, 0, 200, 200)];
    position                   位置(中心点的改变)     [NSValue valueWithCGPoint:CGPointMake(300, 300)];
    contents                   内容,比如UIImageView的图片     imageAnima.toValue = (id)[UIImage imageNamed:@"to"].CGImage;
    opacity                    透明度     @(0.7)
    contentsRect.size.width     横向拉伸缩放     @(0.4)最好是0~1之间的
 
 
 */



总结

柱状图,饼状图都可以这样实现,原理简单就不贴代码了。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值