ios 简单实现半圆形仪表盘 (进度条)


效果图




初始化只需设置分数(0~1)即可


#import "ArcLineView.h"


#define DEGREES_TO_RADIANS(angle) ((angle) / 180.0 * M_PI)//角都转弧度

#define ANGLE 20 //没份20 220


@implementation ArcLineView


- (void)drawRect:(CGRect)rect {

    self.backgroundColor = [UIColor whiteColor];

    //设置圆弧的半径

    CGFloat radius =  rect.size.width/2;

    //设置圆弧的圆心

    CGPoint center = CGPointMake(radius, radius);


    //背景线条

    CGFloat startAngleBag = DEGREES_TO_RADIANS(165);

    CGFloat endAngleBag = DEGREES_TO_RADIANS(165) + DEGREES_TO_RADIANS(210);

    UIBezierPath *pathBag = [UIBezierPath bezierPathWithArcCenter:center radius:radius - 5 startAngle:startAngleBag endAngle:endAngleBag clockwise:YES];

    pathBag.lineWidth = 8;

    pathBag.lineCapStyle = kCGLineJoinRound;

    [[UIColor lightGrayColor] set];

    [pathBag stroke];

    

    //显示的进度条

    CGFloat startAngle = DEGREES_TO_RADIANS(165);

    CGFloat endAngle = DEGREES_TO_RADIANS(165) + DEGREES_TO_RADIANS(210)*_starScore;

    if (_starScore >= 0.6) {

        endAngle = DEGREES_TO_RADIANS(165) + DEGREES_TO_RADIANS(210)*(_starScore-0.5)*2;

    } else {

        endAngle = DEGREES_TO_RADIANS(165) + DEGREES_TO_RADIANS(210)*(_starScore/0.6)*0.2;

    }

    UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:center radius:radius - 5 startAngle:startAngle endAngle:endAngle clockwise:YES];

    path.lineWidth = 8;

    path.lineCapStyle = kCGLineJoinRound;

    [[UIColor redColor] set];

    [path stroke];

    

    //创建文字说明

    if (!self.labelArray.count) {

        for (int i = 0; i < self.titleArray.count; i++) {

            [self creatLabel:self.titleArray[i] withScore:i];

        }

        

        self.scoreLabel = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, 100, 100)];

        self.scoreLabel.center = CGPointMake(center.x, center.y-30);

        self.scoreLabel.textAlignment = NSTextAlignmentCenter;

        self.scoreLabel.font = [UIFont systemFontOfSize:55];

        self.scoreLabel.text = [NSString stringWithFormat:@"%.0f", _starScore*100];

        self.scoreLabel.textColor = [UIColor redColor];

        [self addSubview:self.scoreLabel];

        

        UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 50, 50)];

        label.center = CGPointMake(self.scoreLabel.center.x, center.y+10);

        label.text = @"信用值";

        label.font = [UIFont systemFontOfSize:15];

        label.textColor = [UIColor redColor];

        label.textAlignment = NSTextAlignmentCenter;

        [self addSubview:label];

    }

}


//起始分值

- (void)setStarScore:(CGFloat)starScore {

    _starScore = starScore;

    self.scoreLabel.text = [NSString stringWithFormat:@"%.0f", starScore*100];

    //当下载进度改变时,手动调用重绘方法

    [self setNeedsDisplay];

}



//创建文字说明 label

- (void)creatLabel:(NSString *)title withScore:(CGFloat)index{

    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 23, 15)];

    label.font = [UIFont systemFontOfSize:10];

    label.textAlignment = NSTextAlignmentCenter;

    label.text = title;

    label.textColor = [UIColor blackColor];

    [self addSubview:label];

    CGFloat endAngle = index*ANGLE-200+10;

    label.transform = CGAffineTransformMakeRotation(DEGREES_TO_RADIANS(endAngle)+M_PI_2);//label 旋转


    CGSize size = self.frame.size;

    CGFloat  centerY = size.width/2 - (size.width/2-20)*sin(DEGREES_TO_RADIANS(index*ANGLE-10));

    CGFloat centerX = size.width/2 - (size.width/2-20)*cos(DEGREES_TO_RADIANS(index*ANGLE-10));

    label.center = CGPointMake(centerX, centerY);

    

    [self.labelArray addObject:label];

}


#pragma mark - lazy loading

- (NSMutableArray *)labelArray {

    if (!_labelArray) {

        _labelArray = [NSMutableArray arrayWithCapacity:0];

    }

    return _labelArray;

}

- (NSMutableArray *)titleArray {//分值对应等级

    if (!_titleArray) {

        _titleArray = [NSMutableArray arrayWithCapacity:0];

        [_titleArray addObject:@"0"];

        [_titleArray addObject:@"一般"];

        [_titleArray addObject:@"60"];

        [_titleArray addObject:@"中等"];

        [_titleArray addObject:@"70"];

        [_titleArray addObject:@"良好"];

        [_titleArray addObject:@"80"];

        [_titleArray addObject:@"优秀"];

        [_titleArray addObject:@"90"];

        [_titleArray addObject:@"极好"];

        [_titleArray addObject:@"100"];

    }

    return _titleArray;

}



  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值