| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- //
- // Circle.m
- // YKL
- //
- // Created by Apple on 15/12/7.
- // Copyright © 2015年 Apple. All rights reserved.
- //
- #import "XLCircle.h"
- static CGFloat endPointMargin = 1.0f;
- @interface XLCircle ()
- {
- CAShapeLayer* _trackLayer;
- CAShapeLayer* _progressLayer;
- UIImageView* _endPoint;//在终点位置添加一个点
- }
- @end
- @implementation XLCircle
- -(instancetype)initWithFrame:(CGRect)frame lineWidth:(float)lineWidth
- {
- self = [super initWithFrame:frame];
- if (self) {
- _lineWidth = lineWidth;
- [self buildLayout];
- }
- return self;
- }
- -(void)buildLayout
- {
- float centerX = self.bounds.size.width/2.0;
- float centerY = self.bounds.size.height/2.0;
- //半径
- float radius = (self.bounds.size.width-_lineWidth)/2.0;
-
- //创建贝塞尔路径
- UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(centerX, centerY) radius:radius startAngle:(-0.5f*M_PI) endAngle:1.5f*M_PI clockwise:YES];
-
- //添加背景圆环
- CAShapeLayer *backLayer = [CAShapeLayer layer];
- backLayer.frame = self.bounds;
- backLayer.fillColor = [[UIColor clearColor] CGColor];
- backLayer.strokeColor = RGB_COLOR(@"#f93232", 1).CGColor;//[UIColor colorWithRed:255.0/255.0f green:255.0/255.0f blue:255.0/255.0f alpha:1].CGColor;
- backLayer.lineWidth = _lineWidth;
- backLayer.path = [path CGPath];
- backLayer.strokeEnd = 1;
- [self.layer addSublayer:backLayer];
-
- //创建进度layer
- _progressLayer = [CAShapeLayer layer];
- _progressLayer.frame = self.bounds;
- _progressLayer.fillColor = [[UIColor clearColor] CGColor];
- //指定path的渲染颜色
- _progressLayer.strokeColor = [[UIColor blackColor] CGColor];
- _progressLayer.lineCap = kCALineCapRound;
- _progressLayer.lineWidth = _lineWidth;
- _progressLayer.path = [path CGPath];
- _progressLayer.strokeEnd = 0;
-
- //设置渐变颜色
- CAGradientLayer *gradientLayer = [CAGradientLayer layer];
- gradientLayer.frame = self.bounds;
- [gradientLayer setColors:[NSArray arrayWithObjects:(id)[RGB_COLOR(@"#2889f7", 1) CGColor],(id)[RGB_COLOR(@"#2889f7", 1) CGColor], nil]];
- gradientLayer.startPoint = CGPointMake(0, 0);
- gradientLayer.endPoint = CGPointMake(0, 1);
- [gradientLayer setMask:_progressLayer]; //用progressLayer来截取渐变层
- [self.layer addSublayer:gradientLayer];
-
-
- //用于显示结束位置的小点
- // _endPoint = [[UIImageView alloc] init];
- // _endPoint.frame = CGRectMake(0, 0, _lineWidth - endPointMargin*2,_lineWidth - endPointMargin*2);
- // _endPoint.hidden = true;
- // _endPoint.backgroundColor = [UIColor blackColor];
- // _endPoint.image = [UIImage imageNamed:@"endPoint"];
- // _endPoint.layer.masksToBounds = true;
- // _endPoint.layer.cornerRadius = _endPoint.bounds.size.width/2;
- // [self addSubview:_endPoint];
- }
- -(void)setProgress:(float)progress
- {
- _progress = progress;
- _progressLayer.strokeEnd = progress;
- [self updateEndPoint];
- [_progressLayer removeAllAnimations];
- }
- //更新小点的位置
- -(void)updateEndPoint
- {
- //转成弧度
- CGFloat angle = M_PI*2*_progress;
- float radius = (self.bounds.size.width-_lineWidth)/2.0;
- int index = (angle)/M_PI_2;//用户区分在第几象限内
- float needAngle = angle - index*M_PI_2;//用于计算正弦/余弦的角度
- float x = 0,y = 0;//用于保存_dotView的frame
- switch (index) {
- case 0:
- NSLog(@"第一象限");
- x = radius + sinf(needAngle)*radius;
- y = radius - cosf(needAngle)*radius;
- break;
- case 1:
- NSLog(@"第二象限");
- x = radius + cosf(needAngle)*radius;
- y = radius + sinf(needAngle)*radius;
- break;
- case 2:
- NSLog(@"第三象限");
- x = radius - sinf(needAngle)*radius;
- y = radius + cosf(needAngle)*radius;
- break;
- case 3:
- NSLog(@"第四象限");
- x = radius - cosf(needAngle)*radius;
- y = radius - sinf(needAngle)*radius;
- break;
-
- default:
- break;
- }
-
- //更新圆环的frame
- CGRect rect = _endPoint.frame;
- rect.origin.x = x + endPointMargin;
- rect.origin.y = y + endPointMargin;
- _endPoint.frame = rect;
- //移动到最前
- [self bringSubviewToFront:_endPoint];
- _endPoint.hidden = false;
- if (_progress == 0 || _progress == 1) {
- _endPoint.hidden = true;
- }
- }
- @end
|