XLCircle.m 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. //
  2. // Circle.m
  3. // YKL
  4. //
  5. // Created by Apple on 15/12/7.
  6. // Copyright © 2015年 Apple. All rights reserved.
  7. //
  8. #import "XLCircle.h"
  9. static CGFloat endPointMargin = 1.0f;
  10. @interface XLCircle ()
  11. {
  12. CAShapeLayer* _trackLayer;
  13. CAShapeLayer* _progressLayer;
  14. UIImageView* _endPoint;//在终点位置添加一个点
  15. }
  16. @end
  17. @implementation XLCircle
  18. -(instancetype)initWithFrame:(CGRect)frame lineWidth:(float)lineWidth
  19. {
  20. self = [super initWithFrame:frame];
  21. if (self) {
  22. _lineWidth = lineWidth;
  23. [self buildLayout];
  24. }
  25. return self;
  26. }
  27. -(void)buildLayout
  28. {
  29. float centerX = self.bounds.size.width/2.0;
  30. float centerY = self.bounds.size.height/2.0;
  31. //半径
  32. float radius = (self.bounds.size.width-_lineWidth)/2.0;
  33. //创建贝塞尔路径
  34. UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(centerX, centerY) radius:radius startAngle:(-0.5f*M_PI) endAngle:1.5f*M_PI clockwise:YES];
  35. //添加背景圆环
  36. CAShapeLayer *backLayer = [CAShapeLayer layer];
  37. backLayer.frame = self.bounds;
  38. backLayer.fillColor = [[UIColor clearColor] CGColor];
  39. 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;
  40. backLayer.lineWidth = _lineWidth;
  41. backLayer.path = [path CGPath];
  42. backLayer.strokeEnd = 1;
  43. [self.layer addSublayer:backLayer];
  44. //创建进度layer
  45. _progressLayer = [CAShapeLayer layer];
  46. _progressLayer.frame = self.bounds;
  47. _progressLayer.fillColor = [[UIColor clearColor] CGColor];
  48. //指定path的渲染颜色
  49. _progressLayer.strokeColor = [[UIColor blackColor] CGColor];
  50. _progressLayer.lineCap = kCALineCapRound;
  51. _progressLayer.lineWidth = _lineWidth;
  52. _progressLayer.path = [path CGPath];
  53. _progressLayer.strokeEnd = 0;
  54. //设置渐变颜色
  55. CAGradientLayer *gradientLayer = [CAGradientLayer layer];
  56. gradientLayer.frame = self.bounds;
  57. [gradientLayer setColors:[NSArray arrayWithObjects:(id)[RGB_COLOR(@"#2889f7", 1) CGColor],(id)[RGB_COLOR(@"#2889f7", 1) CGColor], nil]];
  58. gradientLayer.startPoint = CGPointMake(0, 0);
  59. gradientLayer.endPoint = CGPointMake(0, 1);
  60. [gradientLayer setMask:_progressLayer]; //用progressLayer来截取渐变层
  61. [self.layer addSublayer:gradientLayer];
  62. //用于显示结束位置的小点
  63. // _endPoint = [[UIImageView alloc] init];
  64. // _endPoint.frame = CGRectMake(0, 0, _lineWidth - endPointMargin*2,_lineWidth - endPointMargin*2);
  65. // _endPoint.hidden = true;
  66. // _endPoint.backgroundColor = [UIColor blackColor];
  67. // _endPoint.image = [UIImage imageNamed:@"endPoint"];
  68. // _endPoint.layer.masksToBounds = true;
  69. // _endPoint.layer.cornerRadius = _endPoint.bounds.size.width/2;
  70. // [self addSubview:_endPoint];
  71. }
  72. -(void)setProgress:(float)progress
  73. {
  74. _progress = progress;
  75. _progressLayer.strokeEnd = progress;
  76. [self updateEndPoint];
  77. [_progressLayer removeAllAnimations];
  78. }
  79. //更新小点的位置
  80. -(void)updateEndPoint
  81. {
  82. //转成弧度
  83. CGFloat angle = M_PI*2*_progress;
  84. float radius = (self.bounds.size.width-_lineWidth)/2.0;
  85. int index = (angle)/M_PI_2;//用户区分在第几象限内
  86. float needAngle = angle - index*M_PI_2;//用于计算正弦/余弦的角度
  87. float x = 0,y = 0;//用于保存_dotView的frame
  88. switch (index) {
  89. case 0:
  90. NSLog(@"第一象限");
  91. x = radius + sinf(needAngle)*radius;
  92. y = radius - cosf(needAngle)*radius;
  93. break;
  94. case 1:
  95. NSLog(@"第二象限");
  96. x = radius + cosf(needAngle)*radius;
  97. y = radius + sinf(needAngle)*radius;
  98. break;
  99. case 2:
  100. NSLog(@"第三象限");
  101. x = radius - sinf(needAngle)*radius;
  102. y = radius + cosf(needAngle)*radius;
  103. break;
  104. case 3:
  105. NSLog(@"第四象限");
  106. x = radius - cosf(needAngle)*radius;
  107. y = radius - sinf(needAngle)*radius;
  108. break;
  109. default:
  110. break;
  111. }
  112. //更新圆环的frame
  113. CGRect rect = _endPoint.frame;
  114. rect.origin.x = x + endPointMargin;
  115. rect.origin.y = y + endPointMargin;
  116. _endPoint.frame = rect;
  117. //移动到最前
  118. [self bringSubviewToFront:_endPoint];
  119. _endPoint.hidden = false;
  120. if (_progress == 0 || _progress == 1) {
  121. _endPoint.hidden = true;
  122. }
  123. }
  124. @end