123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- //
- // SVProgressAnimatedView.m
- // SVProgressHUD, https://github.com/SVProgressHUD/SVProgressHUD
- //
- // Copyright (c) 2017-2018 Tobias Tiemerding. All rights reserved.
- //
- #import "SVProgressAnimatedView.h"
- @interface SVProgressAnimatedView ()
- @property (nonatomic, strong) CAShapeLayer *ringAnimatedLayer;
- @end
- @implementation SVProgressAnimatedView
- - (void)willMoveToSuperview:(UIView*)newSuperview {
- if (newSuperview) {
- [self layoutAnimatedLayer];
- } else {
- [_ringAnimatedLayer removeFromSuperlayer];
- _ringAnimatedLayer = nil;
- }
- }
- - (void)layoutAnimatedLayer {
- CALayer *layer = self.ringAnimatedLayer;
- [self.layer addSublayer:layer];
-
- CGFloat widthDiff = CGRectGetWidth(self.bounds) - CGRectGetWidth(layer.bounds);
- CGFloat heightDiff = CGRectGetHeight(self.bounds) - CGRectGetHeight(layer.bounds);
- layer.position = CGPointMake(CGRectGetWidth(self.bounds) - CGRectGetWidth(layer.bounds) / 2 - widthDiff / 2, CGRectGetHeight(self.bounds) - CGRectGetHeight(layer.bounds) / 2 - heightDiff / 2);
- }
- - (CAShapeLayer*)ringAnimatedLayer {
- if(!_ringAnimatedLayer) {
- CGPoint arcCenter = CGPointMake(self.radius+self.strokeThickness/2+5, self.radius+self.strokeThickness/2+5);
- UIBezierPath* smoothedPath = [UIBezierPath bezierPathWithArcCenter:arcCenter radius:self.radius startAngle:(CGFloat)-M_PI_2 endAngle:(CGFloat) (M_PI + M_PI_2) clockwise:YES];
-
- _ringAnimatedLayer = [CAShapeLayer layer];
- _ringAnimatedLayer.contentsScale = [[UIScreen mainScreen] scale];
- _ringAnimatedLayer.frame = CGRectMake(0.0f, 0.0f, arcCenter.x*2, arcCenter.y*2);
- _ringAnimatedLayer.fillColor = [UIColor clearColor].CGColor;
- _ringAnimatedLayer.strokeColor = self.strokeColor.CGColor;
- _ringAnimatedLayer.lineWidth = self.strokeThickness;
- _ringAnimatedLayer.lineCap = kCALineCapRound;
- _ringAnimatedLayer.lineJoin = kCALineJoinBevel;
- _ringAnimatedLayer.path = smoothedPath.CGPath;
- }
- return _ringAnimatedLayer;
- }
- - (void)setFrame:(CGRect)frame {
- if(!CGRectEqualToRect(frame, super.frame)) {
- [super setFrame:frame];
-
- if(self.superview) {
- [self layoutAnimatedLayer];
- }
- }
- }
- - (void)setRadius:(CGFloat)radius {
- if(radius != _radius) {
- _radius = radius;
-
- [_ringAnimatedLayer removeFromSuperlayer];
- _ringAnimatedLayer = nil;
-
- if(self.superview) {
- [self layoutAnimatedLayer];
- }
- }
- }
- - (void)setStrokeColor:(UIColor*)strokeColor {
- _strokeColor = strokeColor;
- _ringAnimatedLayer.strokeColor = strokeColor.CGColor;
- }
- - (void)setStrokeThickness:(CGFloat)strokeThickness {
- _strokeThickness = strokeThickness;
- _ringAnimatedLayer.lineWidth = _strokeThickness;
- }
- - (void)setStrokeEnd:(CGFloat)strokeEnd {
- _strokeEnd = strokeEnd;
- _ringAnimatedLayer.strokeEnd = _strokeEnd;
- }
- - (CGSize)sizeThatFits:(CGSize)size {
- return CGSizeMake((self.radius+self.strokeThickness/2+5)*2, (self.radius+self.strokeThickness/2+5)*2);
- }
- @end
|