iOS实现一个颜色渐变的弧形进度条 发表于 2017-09-05 直接上代码(已封装).h12345#import <UIKit/UIKit.h>@interface ArcProgressView : UIView-(void)setPercent:(NSInteger)percent animated:(BOOL)animated;@end .m123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687#import "ArcProgressView.h"#import "UIView+WSDatePicker.h"#define degreesToRadians(x) (M_PI*(x)/180.0) //把角度转换成PI的方式#define PROGREESS_WIDTH 140 //圆直径#define PROGRESS_LINE_WIDTH 8 //弧线的宽度#define UIColorFromRGB(rgbValue) [UIColor \colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 \green:((float)((rgbValue & 0xFF00) >> 8))/255.0 \blue:((float)(rgbValue & 0xFF))/255.0 alpha:1.0]@implementation ArcProgressView{ CAShapeLayer *_trackLayer; CAShapeLayer *_progressLayer;}- (instancetype)initWithFrame:(CGRect)frame{ self = [super initWithFrame:frame]; if (self) { [self setupUI]; } return self;}- (void)setupUI{ _trackLayer = [CAShapeLayer layer];//创建一个track shape layer _trackLayer.frame = self.bounds; [self.layer addSublayer:_trackLayer]; _trackLayer.fillColor = [[UIColor clearColor] CGColor]; _trackLayer.strokeColor = [UIColorFromRGB(0xf2f2f2) CGColor];//指定path的渲染颜色 _trackLayer.opacity = 0.25; //背景同学你就甘心做背景吧,不要太明显了,透明度小一点 _trackLayer.lineCap = kCALineCapRound;//指定线的边缘是圆的 _trackLayer.lineWidth = PROGRESS_LINE_WIDTH;//线的宽度 UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(PROGREESS_WIDTH/2, PROGREESS_WIDTH/2) radius:(PROGREESS_WIDTH-PROGRESS_LINE_WIDTH)/2 startAngle:degreesToRadians(-210) endAngle:degreesToRadians(30) clockwise:YES];//上面说明过了用来构建圆形 _trackLayer.path =[path CGPath]; //把path传递給layer,然后layer会处理相应的渲染,整个逻辑和CoreGraph是一致的。 //然后,创建一个新的CAShapeLayer来截取这个颜色渐变的层 _progressLayer = [CAShapeLayer layer]; _progressLayer.frame = self.bounds; _progressLayer.fillColor = [[UIColor clearColor] CGColor]; _progressLayer.strokeColor = [[UIColor redColor] CGColor]; _progressLayer.lineCap = kCALineCapRound; _progressLayer.lineWidth = PROGRESS_LINE_WIDTH; _progressLayer.path = [path CGPath]; _progressLayer.strokeEnd = 0; CALayer *gradientLayer = [CALayer layer]; CAGradientLayer *gradientLayer1 = [CAGradientLayer layer]; gradientLayer1.frame = CGRectMake(0, 0, self.width/2, self.height); [gradientLayer1 setColors:[NSArray arrayWithObjects:(id)[[UIColor greenColor] CGColor],(id)[UIColorFromRGB(0xfde802) CGColor], nil]]; [gradientLayer1 setLocations:@[@0.5,@0.9,@1 ]]; [gradientLayer1 setStartPoint:CGPointMake(0.5, 1)]; [gradientLayer1 setEndPoint:CGPointMake(0.5, 0)]; [gradientLayer addSublayer:gradientLayer1]; CAGradientLayer *gradientLayer2 = [CAGradientLayer layer]; [gradientLayer2 setLocations:@[@0.1,@0.5,@1]]; gradientLayer2.frame = CGRectMake(self.width/2, 0, self.width/2, self.height); [gradientLayer2 setColors:[NSArray arrayWithObjects:(id)[UIColorFromRGB(0xfde802) CGColor],(id)[[UIColor redColor] CGColor], nil]]; [gradientLayer2 setStartPoint:CGPointMake(0.5, 0)]; [gradientLayer2 setEndPoint:CGPointMake(0.5, 1)]; [gradientLayer addSublayer:gradientLayer2]; [gradientLayer setMask:_progressLayer]; //用progressLayer来截取渐变层 [self.layer addSublayer:gradientLayer];}-(void)setPercent:(NSInteger)percent animated:(BOOL)animated{ [CATransaction begin]; [CATransaction setDisableActions:!animated]; [CATransaction setAnimationTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]]; [CATransaction setAnimationDuration:1.0]; _progressLayer.strokeEnd = percent/100.0; [CATransaction commit]; }@end