TUICircleLodingView.m 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. //
  2. // TUICircleLodingView.m
  3. // TUIChat
  4. //
  5. // Created by wyl on 2023/4/24.
  6. // Copyright © 2023 Tencent. All rights reserved.
  7. //
  8. #import "TUICircleLodingView.h"
  9. #define kCircleUnFillColor [[UIColor whiteColor] colorWithAlphaComponent:0.4]
  10. #define kCircleFillColor [UIColor whiteColor]
  11. @interface TUICircleLodingView ()
  12. @end
  13. @implementation TUICircleLodingView
  14. - (instancetype)initWithFrame:(CGRect)frame {
  15. self = [super initWithFrame:frame];
  16. if (self) {
  17. [self drawProgressCircleWithEndAngle:-M_PI_2 + M_PI * 2 isGrayCircle:YES];
  18. }
  19. return self;
  20. }
  21. - (void)setProgress:(double)progress {
  22. _progress = progress;
  23. self.labProgress.text = [NSString stringWithFormat:@"%.0f%%", progress];
  24. [self drawProgress];
  25. }
  26. - (void)drawProgress {
  27. if (self.progress >= 100) {
  28. return;
  29. }
  30. [self drawProgressCircleWithEndAngle:-M_PI_2 + M_PI * 2 * (self.progress) * 0.01 isGrayCircle:NO];
  31. }
  32. - (void)drawProgressCircleWithEndAngle:(CGFloat)endAngle isGrayCircle:(BOOL)isGrayCircle {
  33. CGPoint center = CGPointMake(self.frame.size.width / 2, self.frame.size.width / 2);
  34. CGFloat radius = self.frame.size.width / 2;
  35. CGFloat startA = -M_PI_2;
  36. CGFloat endA = endAngle;
  37. CAShapeLayer *layer;
  38. if (isGrayCircle) {
  39. layer = self.grayProgressLayer;
  40. } else {
  41. layer = self.progressLayer;
  42. }
  43. UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:center radius:radius startAngle:startA endAngle:endA clockwise:YES];
  44. layer.path = [path CGPath];
  45. }
  46. - (UILabel *)labProgress {
  47. if (!_labProgress) {
  48. UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
  49. label.textAlignment = NSTextAlignmentCenter;
  50. label.center = CGPointMake(self.frame.size.width / 2, self.frame.size.width / 2);
  51. label.textColor = kCircleFillColor;
  52. label.font = [UIFont systemFontOfSize:10];
  53. [self addSubview:label];
  54. _labProgress = label;
  55. }
  56. return _labProgress;
  57. }
  58. - (CAShapeLayer *)grayProgressLayer {
  59. if (!_grayProgressLayer) {
  60. _grayProgressLayer = [CAShapeLayer layer];
  61. _grayProgressLayer.frame = self.bounds;
  62. _grayProgressLayer.fillColor = [[UIColor clearColor] CGColor];
  63. _grayProgressLayer.strokeColor = kCircleUnFillColor.CGColor;
  64. _grayProgressLayer.opacity = 1;
  65. _grayProgressLayer.lineCap = kCALineCapRound;
  66. _grayProgressLayer.lineWidth = 3;
  67. [self.layer addSublayer:_grayProgressLayer];
  68. }
  69. return _grayProgressLayer;
  70. }
  71. - (CAShapeLayer *)progressLayer {
  72. if (!_progressLayer) {
  73. _progressLayer = [CAShapeLayer layer];
  74. _progressLayer.frame = self.bounds;
  75. _progressLayer.fillColor = [[UIColor clearColor] CGColor];
  76. _progressLayer.strokeColor = kCircleFillColor.CGColor;
  77. _progressLayer.opacity = 1;
  78. _progressLayer.lineCap = kCALineCapRound;
  79. _progressLayer.lineWidth = 3;
  80. [self.layer addSublayer:_progressLayer];
  81. }
  82. return _progressLayer;
  83. }
  84. @end