iOS开发之带有渐变色的进度条

通过上一篇文章,我们绘制了一个简单的不能在简单的环形进度条,下面绘制一个带有渐变色的进度条,主要还有使用了UIBezierPath和CAShapeLayer方法。本文的参考文章

效果展示


主要代码及知识如下。先绘制一个渐变色

// 渐变色
- (void)setupColorLayer {
    self.colorLayer = [CAShapeLayer layer];
    self.colorLayer.frame = self.bounds;
    [self.layer addSublayer:self.colorLayer];
    
    CAGradientLayer *leftLayer = [CAGradientLayer layer];
    leftLayer.frame = CGRectMake(0, 0, self.bounds.size.width / 2, self.bounds.size.height);
    // 分段设置渐变色
    leftLayer.locations = @[@0.3, @0.5, @1];
    leftLayer.colors = @[(id)[UIColor yellowColor].CGColor, (id)[UIColor greenColor].CGColor];
    [self.colorLayer addSublayer:leftLayer];
    
    CAGradientLayer *rightLayer = [CAGradientLayer layer];
    rightLayer.frame = CGRectMake(self.bounds.size.width / 2, 0, self.bounds.size.width / 2, self.bounds.size.height);
    rightLayer.locations = @[@0.3, @0.5, @1];
    rightLayer.colors = @[(id)[UIColor yellowColor].CGColor, (id)[UIColor redColor].CGColor];
    [self.colorLayer addSublayer:rightLayer];
}
在绘制一个圆形遮罩,放在colorLayer渐变色图层上,该圆形遮罩绘制如下:

// 生成遮罩
- (CAShapeLayer *)generateMaskLayer {
    
    CAShapeLayer *layer = [CAShapeLayer layer];
    layer.frame = self.bounds;
    
    CGPoint centerPoint = CGPointMake(self.bounds.size.width * 0.5, self.bounds.size.height * 0.5);//设置圆心位置
    CGFloat radius = 90;// 设置半径
    CGFloat startA = - M_PI_2;// 设置圆的起始位置
    CGFloat endA = - M_PI_2 + M_PI * 2;// 设置圆的终止位置
    
    // 创建一个圆心为父视图中点的圆,半径为父视图宽的2/5,起始角度是从-240°到60°
//    UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(self.bounds.size.width / 2, self.bounds.size.height / 2) radius:self.bounds.size.width / 2.5 startAngle:-3 / 4 * M_PI endAngle:1 / 3 * M_PI clockwise:YES];
    
    UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:centerPoint radius:radius startAngle:startA endAngle:endA clockwise:YES];
    
    layer.lineWidth = 20;
    layer.path = path.CGPath;
    layer.fillColor = [UIColor clearColor].CGColor; // 填充色为透明(不设置为黑色)
    layer.strokeColor = [UIColor blackColor].CGColor; // 随便设置一个边框颜色
    layer.lineCap = kCALineCapRound; // 设置线为圆角
    return layer;
}

// 设置渐变色遮罩
-(void)setupColorMaskLayer {
    
    CAShapeLayer *layer = [self generateMaskLayer];
    layer.lineWidth = 20.5; // 渐变遮罩线宽较大,防止蓝色遮罩有边露出来
    self.colorLayer.mask = layer;
    
    self.colorMaskLayer = [CAShapeLayer layer];
    self.colorMaskLayer = layer;
}
由于还有一个蓝色背景,我们可以创建一个蓝色的view充当,并再将相同的圆形遮罩,放在蓝色view上,

// 设置蓝色view遮罩
- (void)setupBlueMaskLayer {
    
    CAShapeLayer *layer = [self generateMaskLayer];
    self.layer.mask = layer;
    self.blueMaskLayer = layer;
}
拖动滑块,我们就改变渐变色colorMaskLayer的strokeEnd属性即可

self.colorMaskLayer.strokeEnd = strokeEnd;
这样一个带有渐变色的环形进度条就绘制成了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值