// // SVProgressAnimatedView.m // SVProgressHUD, https://github.com/SVProgressHUD/SVProgressHUD // // Copyright (c) 2017-2019 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 = kCALineJoinRound; _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