美文网首页
扇形进度条

扇形进度条

作者: justjustjust | 来源:发表于2019-04-23 17:59 被阅读0次

分享一个扇形进度条,核心思想是用贝塞尔曲线绘制扇形形成进度条子单位,然后通过修改layer的fillcolor实现进度条前进的效果。


#import "ZKJProgressBar.h"

@interface ZKJProgressBar ()

@property (nonatomic, assign) CGFloat angle;

@property (nonatomic, assign) NSInteger lightBarCounts;

@property (nonatomic, assign) CGFloat lightBarAngle;

@property (nonatomic, assign) CGFloat insideDiameter;

@property (nonatomic, assign) CGFloat outsideDiameter;

@property (nonatomic, strong) NSMutableArray *layerArray;

@property (nonatomic, strong) UIColor *normalColor;

@property (nonatomic, strong) UIColor *highlightColor;

@end

@implementation ZKJProgressBar

- (instancetype)initWithFrame:(CGRect)frame {

    if(self= [superinitWithFrame:frame]) {

        [selfinitUI];

    }

    return self;

}

- (void)initUI {



    self.backgroundColor = [UIColor yellowColor];



    self.layerArray = [[NSMutableArray alloc] initWithCapacity:0];



    self.angle=M_PI_4;

    self.lightBarCounts = 40;

    self.lightBarAngle= (M_PI*2/360) *2;

    self.insideDiameter = 80;

    self.outsideDiameter = 100;

    self.normalColor= [UIColorcyanColor];

    self.highlightColor = [UIColor redColor];



    if (self.lightBarAngle * self.lightBarCounts > (M_PI * 2 - self.angle)) {

        return;

    }



    CGFloatstartAngle = (M_PI-self.angle) /2+self.angle;

    CGFloatendAngle = startAngle +self.lightBarAngle;

    CGFloat angleGap = ((M_PI * 2 - self.angle) - self.lightBarCounts * self.lightBarAngle) / (self.lightBarCounts - 1);



    for(inti =0; i <self.lightBarCounts; i++) {



        UIBezierPath *path = [UIBezierPath bezierPath];

        [pathaddArcWithCenter:CGPointMake(self.frame.size.width / 2, self.frame.size.height / 2) radius:self.outsideDiameter startAngle:startAngle endAngle:endAngle clockwise:YES];

        [pathaddLineToPoint:CGPointMake(self.frame.size.width/2,self.frame.size.height/2)];

        [pathclosePath];

        CAShapeLayer*layer = [[CAShapeLayeralloc]init];

        layer.path= path.CGPath;

        layer.strokeColor=self.normalColor.CGColor;

        layer.fillColor=self.normalColor.CGColor;

        [self.layeraddSublayer:layer];



        [self.layerArrayaddObject:layer];



        startAngle = startAngle + angleGap +self.lightBarAngle;

        endAngle = startAngle +self.lightBarAngle;

    }



    UIBezierPath *path2 = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(self.frame.size.width / 2 - self.insideDiameter, self.frame.size.height / 2 - self.insideDiameter, self.insideDiameter * 2, self.insideDiameter * 2) cornerRadius:self.insideDiameter];

    CAShapeLayer *layer = [[CAShapeLayer alloc] init];

    layer.path= path2.CGPath;

    layer.strokeColor = self.backgroundColor.CGColor;

    layer.fillColor = self.backgroundColor.CGColor;

    [self.layeraddSublayer:layer];

}

- (void)zkj_setProgress:(NSInteger)progress {



    NSIntegerindex = progress /100.0*self.layerArray.count;



    for(inti =0; i <self.layerArray.count; i++) {



        CAShapeLayer*layer =self.layerArray[i];

        if(i < index) {

            layer.strokeColor=self.highlightColor.CGColor;

            layer.fillColor=self.highlightColor.CGColor;

        }else{

            layer.strokeColor=self.normalColor.CGColor;

            layer.fillColor=self.normalColor.CGColor;

        }

    }

}

相关文章

网友评论

      本文标题:扇形进度条

      本文链接:https://www.haomeiwen.com/subject/snjbgqtx.html