#import <UIKit/UIKit.h>@interface CircleProgressView : UIView/**起始值(0-1)*/@property(nonatomic,assign)CGFloat fstartValue;/**边框宽度*/@property(nonatomic,assign)CGFloat flineWidth;/**线条颜色*/@property(nonatomic,strong)UIColor *lineColor;/**变化的值*/@property(nonatomic,assign)CGFloat fvalue;@end#import "CircleProgressView.h"@interface CircleProgressView (){ CAShapeLayer *_shapeLayer;}@end@implementation CircleProgressView@synthesize fstartValue=_fstartValue;@synthesize flineWidth=_flineWidth;@synthesize lineColor=_lineColor;@synthesize fvalue=_fvalue;- (instancetype)initWithFrame:(CGRect)frame{ self = [super initWithFrame:frame]; if (self) { /**创建带形状的图层*/ _shapeLayer=[CAShapeLayer layer]; _shapeLayer.frame = self.bounds; _shapeLayer.strokeEnd = 0.f; /*创建布赛尔曲线*/ UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:self.bounds]; /**把图层和不塞尔曲线通过path进行关联*/ _shapeLayer.path = path.CGPath; /**设置图层的填充颜色、宽度、边框颜色*/ _shapeLayer.fillColor = [UIColor clearColor].CGColor; _shapeLayer.lineWidth = 1.0f; _shapeLayer.strokeColor = [UIColor redColor].CGColor; [self.layer addSublayer:_shapeLayer]; } return self;}/** * @brief 重写fstartValue的setter方法 * @param fstartValue 设置圆形strokeStart起始值 * @since */- (void)setFstartValue:(CGFloat)fstartValue{ _fstartValue = fstartValue; _shapeLayer.strokeStart = fstartValue; }- (CGFloat)fstartValue{ return _fstartValue;}/** * @brief 重写flineWidth的setter方法 * @param flineWidth 设置圆形边框宽度 * @since */- (void)setFlineWidth:(CGFloat)flineWidth{ _flineWidth = flineWidth; _shapeLayer.lineWidth = flineWidth;}/** * @brief 重写lineColor的setter方法 * @param lineColor 设置圆形边框颜色 * @since */- (void)setLineColor:(UIColor *)lineColor{ _lineColor = lineColor; _shapeLayer.strokeColor = lineColor.CGColor;}- (UIColor *)lineColor{ return _lineColor;}/** * @brief 重写fvalue的setter方法 * @param lineColor 设置圆形的strokeEnd值 * @since */- (void)setFvalue:(CGFloat)fvalue{ _fvalue = fvalue; _shapeLayer.strokeEnd = fvalue;}- (CGFloat)fvalue{ return _fvalue;}@end#import "ViewController.h"#import "CircleProgressView.h"@interface ViewController (){ CircleProgressView *progress;}@end@implementation ViewController- (void)viewDidLoad{ [super viewDidLoad]; progress = [[CircleProgressView alloc]initWithFrame:CGRectMake(0, 0, 200, 200)]; progress.center = self.view.center; progress.lineColor = [UIColor redColor]; progress.flineWidth = 1.0f; progress.fstartValue = 0; [self.view addSubview:progress]; [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(circleAnimation) userInfo:nil repeats:YES]; }- (void)circleAnimation{ progress.fvalue = arc4random()%100/100.f;}- (void)didReceiveMemoryWarning{ [super didReceiveMemoryWarning]; }@end
详细解决方案
透过布赛尔曲线以及CAShapeLayer的strokeStart 、strokeEnd 属性来实现一个圆形进度条
热度:33 发布时间:2016-04-25 05:42:28.0