You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
96 lines
3.0 KiB
96 lines
3.0 KiB
// |
|
// 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
|
|
|