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;
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值