#import <UIKit/UIKit.h>
@interface SNCircleProgressView : UIView
/**
* 進度值0-1.0之間
*/
@property (nonatomic,assign)CGFloat progressValue;
/**
* 邊寬
*/
@property(nonatomic,assign) CGFloat progressStrokeWidth;
/**
* 進度條顔色
*/
@property(nonatomic,strong)UIColor *progressColor;
/**
* 進度條軌道顔色
*/
@property(nonatomic,strong)UIColor *progressTrackColor;
@end
#import "SNCircleProgressView.h"
@interface SNCircleProgressView ()
{
CAShapeLayer *backGroundLayer; //背景圖層
CAShapeLayer *frontFillLayer; //用來填充的圖層
UIBezierPath *backGroundBezierPath; //背景貝賽爾曲線
UIBezierPath *frontFillBezierPath; //用來填充的貝賽爾曲線
}
@end
@implementation SNCircleProgressView
@synthesize progressColor = _progressColor;
@synthesize progressTrackColor = _progressTrackColor;
@synthesize progressValue = _progressValue;
@synthesize progressStrokeWidth = _progressStrokeWidth;
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
if (self = [super initWithCoder:aDecoder]) {
[self setUp];
}
return self;
}
- (instancetype)initWithFrame:(CGRect)frame
{
if (self = [super initWithFrame:frame])
{
[self setUp];
}
return self;
}
/**
* 初始化建立圖層
*/
- (void)setUp
{
//建立背景圖層
backGroundLayer = [CAShapeLayer layer];
backGroundLayer.fillColor = nil;
backGroundLayer.frame = self.bounds;
//建立填充圖層
frontFillLayer = [CAShapeLayer layer];
frontFillLayer.fillColor = nil;
frontFillLayer.frame = self.bounds;
[self.layer addSublayer:backGroundLayer];
[self.layer addSublayer:frontFillLayer];
}
- (void)setProgressColor:(UIColor *)progressColor
{
_progressColor = progressColor;
frontFillLayer.strokeColor = progressColor.CGColor;
}
- (UIColor *)progressColor
{
return _progressColor;
}
- (void)setProgressTrackColor:(UIColor *)progressTrackColor
{
_progressTrackColor = progressTrackColor;
backGroundLayer.strokeColor = progressTrackColor.CGColor;
backGroundBezierPath = [UIBezierPath bezierPathWithArcCenter:self.center radius:(CGRectGetWidth(self.bounds)-self.progressStrokeWidth)/2.f startAngle:0 endAngle:M_PI*2
clockwise:YES];
backGroundLayer.path = backGroundBezierPath.CGPath;
}
- (UIColor *)progressTrackColor
{
return _progressTrackColor;
}
- (void)setProgressValue:(CGFloat)progressValue
{
_progressValue = progressValue;
frontFillBezierPath = [UIBezierPath bezierPathWithArcCenter:self.center radius:(CGRectGetWidth(self.bounds)-self.progressStrokeWidth)/2.f startAngle:-M_PI_4 endAngle:(2*M_PI)*progressValue-M_PI_4 clockwise:YES];
frontFillLayer.path = frontFillBezierPath.CGPath;
}
- (CGFloat)progressValue
{
return _progressValue;
}
- (void)setProgressStrokeWidth:(CGFloat)progressStrokeWidth
{
_progressStrokeWidth = progressStrokeWidth;
frontFillLayer.lineWidth = progressStrokeWidth;
backGroundLayer.lineWidth = progressStrokeWidth;
}
- (CGFloat)progressStrokeWidth
{
return _progressStrokeWidth;
}
@end
#import "ViewController.h"
#import "SNCircleProgressView.h"
@interface ViewController ()
{
SNCircleProgressView *progressView;
}
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
progressView = [[SNCircleProgressView alloc]initWithFrame:CGRectMake(40,80, 100, 100)];
progressView.progressColor = [UIColor redColor];
progressView.progressStrokeWidth = 5.f;
progressView.progressTrackColor = [UIColor whiteColor];
[self.view addSubview:progressView];
[NSTimer scheduledTimerWithTimeInterval:1.f target:self selector:@selector(changeProgressValue) userInfo:nil repeats:YES];
}
- (void)changeProgressValue
{
progressView.progressValue += 0.1;
if (progressView.progressValue>=1.f) {
progressView.progressValue = 0.1f;
}
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end