ios弧形进度条_IOS 圆形进度条

//

//CCProgressView.m//Demo//

//Created by leao on 2017/8/7.//Copyright © 2017年 zaodao. All rights reserved.//

#import "CCProgressView.h"

#import

#import

#import

#define kCCProgressFillColor [UIColor clearColor]

#define kCCProgressTintColor RGBCOLOR(214, 88, 45)

#define kCCTrackTintColor RGBCOLOR(243, 212, 187)

#define PROGRESS_WIDTH self.frame.size.width

#define PROGRESS_HEIGHT self.frame.size.height

#define kAnimTimeInterval 2

@interfaceCCProgressView ()

@property(nonatomic, strong) CAShapeLayer*trackLayer;

@property(nonatomic, strong) CAShapeLayer*progressLayer;@end

@implementationCCProgressView-(instancetype)initWithFrame:(CGRect)frame

{

self=[super initWithFrame:frame];if(self) {

[self initSubviews];

}returnself;

}-(instancetype)init

{

self=[super init];if(self) {

[self initSubviews];

}returnself;

}#pragma mark - private

- (void)initSubviews

{

_progressViewStyle=CCProgressViewStyleDefault;

_progressTintColor=kCCProgressTintColor;

_trackTintColor=kCCTrackTintColor;

_lineWidth= 10;

_trackerWidth= 10;

_fillColor=kCCProgressFillColor;

_clockwise=YES;

_startAngle= - M_PI / 2.0;

self.backgroundColor=[UIColor clearColor];

self.trackLayer=[CAShapeLayer layer];

self.trackLayer.lineCap=kCALineCapButt;

self.trackLayer.lineJoin=kCALineCapButt;

self.trackLayer.lineWidth=_lineWidth;

self.trackLayer.fillColor=nil;

self.trackLayer.strokeColor=_trackTintColor.CGColor;

self.trackLayer.frame=self.bounds;

[self.layer addSublayer:self.trackLayer];

self.progressLayer=[CAShapeLayer layer];

self.progressLayer.lineCap=kCALineCapButt;

self.progressLayer.lineJoin=kCALineCapButt;

self.progressLayer.lineWidth=_trackerWidth;

self.progressLayer.fillColor=_fillColor.CGColor;

self.progressLayer.strokeColor=_progressTintColor.CGColor;

self.progressLayer.frame=self.bounds;

[self.layer addSublayer:self.progressLayer];

self.progressLayer.strokeEnd= 0.0;

[self addSubview:self.centerBtn];

}- (void)layoutSubviews

{

[super layoutSubviews];

[self updateLayerPath];

}#pragma mark - private

- (UIButton *)centerBtn

{if(!_centerBtn)

{

_centerBtn= [[UIButton alloc] initWithFrame:CGRectMake(0, 0, PROGRESS_WIDTH - 14, PROGRESS_HEIGHT - 14)];

_centerBtn.center= CGPointMake(PROGRESS_WIDTH/2, PROGRESS_HEIGHT/2);

_centerBtn.titleLabel.textAlignment=NSTextAlignmentCenter;

_centerBtn.layer.cornerRadius= _centerBtn.width/2;

_centerBtn.backgroundColor= RGBCOLOR(246, 227, 204);

_centerBtn.titleLabel.adjustsFontSizeToFitWidth=YES;

_centerBtn.userInteractionEnabled=NO;

_centerBtn.layer.masksToBounds=YES;

}return_centerBtn;

}- (void)updateLayerPath

{if (_progressViewStyle ==CCProgressViewStyleCircle) {

self.trackLayer.frame=self.bounds;

self.progressLayer.frame=self.bounds;

CGFloat radius= CGRectGetWidth(self.frame) > CGRectGetHeight(self.frame) ?(CGRectGetHeight(self.frame)- _lineWidth) / 2.0 : (CGRectGetWidth(self.frame) - _lineWidth) / 2.0;

UIBezierPath*bezierPath = [UIBezierPath bezierPathWithArcCenter:self.progressLayer.position radius:radius startAngle:_startAngle endAngle:_clockwise ? _startAngle + 2 * M_PI : _startAngle - 2 *M_PI clockwise:_clockwise];

self.trackLayer.path=bezierPath.CGPath;

self.progressLayer.path=bezierPath.CGPath;

}else{

self.trackLayer.frame= CGRectMake(0, (CGRectGetHeight(self.frame) - _lineWidth) / 2.0, CGRectGetWidth(self.frame), _lineWidth);

self.progressLayer.frame=self.trackLayer.frame;

UIBezierPath*bezierPath =[UIBezierPath bezierPath];

[bezierPath moveToPoint:CGPointMake(0, self.progressLayer.position.y)];

[bezierPath addLineToPoint:CGPointMake(CGRectGetWidth(self.frame), self.progressLayer.position.y)];

self.trackLayer.path=bezierPath.CGPath;

self.progressLayer.path=bezierPath.CGPath;

}

}#pragma mark - setter

- (void)setTrackTintColor:(UIColor *)trackTintColor

{

_trackTintColor=trackTintColor;

self.trackLayer.strokeColor=trackTintColor.CGColor;

}- (void)setProgressTintColor:(UIColor *)progressTintColor

{

_progressTintColor=progressTintColor;

self.progressLayer.strokeColor=progressTintColor.CGColor;

}- (void)setProgressFullTintColor:(UIColor *)progressFullTintColor

{

_progressFullTintColor=progressFullTintColor;if (self.progressLayer.strokeEnd >= 1.0) {

self.progressLayer.strokeEnd= 1.0;

self.progressLayer.strokeColor=_progressFullTintColor.CGColor;

}

}- (void)setLineWidth:(CGFloat)lineWidth

{

_lineWidth=lineWidth;//self.trackLayer.lineWidth = lineWidth;

self.progressLayer.lineWidth =lineWidth;if (_progressViewStyle !=CCProgressViewStyleCircle) {

[self updateLayerPath];

}

}- (void)setTrackerWidth:(CGFloat)trackerWidth {

_trackerWidth=trackerWidth;

self.trackLayer.lineWidth=_trackerWidth;if (_progressViewStyle !=CCProgressViewStyleCircle) {

[self updateLayerPath];

}

}#pragma mark - setter (CCProgressViewStyleCircle)

- (void)setFillColor:(UIColor *)fillColor

{

_fillColor=fillColor;

self.progressLayer.fillColor=fillColor.CGColor;

}- (void)setClockwise:(BOOL)clockwise

{

_clockwise=clockwise;

[self updateLayerPath];

}- (void)setStartAngle:(CGFloat)startAngle

{

_startAngle=startAngle;

[self updateLayerPath];

}- (void)setProgress:(CGFloat)progress

{

[self setProgress:progress animated:NO];

}- (void)setProgress:(CGFloat)progress animated:(BOOL)animated

{if (animated) { //这里的动画可以直接使用CABasicAnimation

POPBasicAnimation *basicAnim =[POPBasicAnimation animationWithPropertyNamed:kPOPShapeLayerStrokeEnd];if(basicAnim) {

basicAnim.duration=kAnimTimeInterval;

basicAnim.toValue=@(progress);

}else{

basicAnim=[POPBasicAnimation animationWithPropertyNamed:kPOPShapeLayerStrokeEnd];

basicAnim.fromValue=@(self.progressLayer.strokeEnd);

basicAnim.toValue=@(progress);

basicAnim.duration= 4 *kAnimTimeInterval;

basicAnim.removedOnCompletion=YES;

}

@weakify(self);

basicAnim.completionBlock= ^(POPAnimation *anim, BOOL finished) {

@strongify(self);

POPPropertyAnimation*basicAnim = (POPPropertyAnimation *)anim;

self.progressLayer.strokeEnd=[basicAnim.toValue doubleValue];if (self.progressLayer.strokeEnd >= 1.0 &&_progressFullTintColor) {

self.progressLayer.strokeEnd= 1.0;

self.progressLayer.strokeColor=_progressFullTintColor.CGColor;

}

};

[self.progressLayer pop_addAnimation:basicAnim forKey:kPOPShapeLayerStrokeEnd];

}else{

self.progressLayer.strokeEnd=progress;if (self.progressLayer.strokeEnd >= 1.0 &&_progressFullTintColor) {

self.progressLayer.strokeEnd= 1.0;

self.progressLayer.strokeColor=_progressFullTintColor.CGColor;

}

}

}@end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值