// // PKPendingView.m // Download // // Created by Pavel on 30/05/15. // Copyright (c) 2015 Katunin. All rights reserved. // #import "PKPendingView.h" #import "NSLayoutConstraint+PKDownloadButton.h" #import "CALayer+PKDownloadButtonAnimations.h" static NSString *const kSpinAnimationKey = @"PKSpin"; static const CGFloat kDefaultRaduis = 13.f; static const CGFloat kDefaultEmptyLineRadians = 0.4f; static const CGFloat kDefaultSpinTime = 1.f; @interface PKPendingView () @property (nonatomic, weak) PKCircleView *circleView; @property (nonatomic, weak) NSLayoutConstraint *width; @property (nonatomic, weak) NSLayoutConstraint *height; @property (nonatomic, assign) BOOL isSpinning; - (PKCircleView *)createCircleView; - (NSArray *)createConstraints; @end static PKPendingView *CommonInit(PKPendingView *self) { if (self != nil) { PKCircleView *circleView = [self createCircleView]; circleView.translatesAutoresizingMaskIntoConstraints = NO; [self addSubview:circleView]; self.circleView = circleView; self.circleView.userInteractionEnabled = NO; [self addConstraints:[self createConstraints]]; self.emptyLineRadians = kDefaultEmptyLineRadians; self.radius = kDefaultRaduis; self.clipsToBounds = NO; self.spinTime = kDefaultSpinTime; [self startSpin]; } return self; } @implementation PKPendingView #pragma mark - initialization - (id)initWithCoder:(NSCoder *)decoder { return CommonInit([super initWithCoder:decoder]); } - (instancetype)initWithFrame:(CGRect)frame { return CommonInit([super initWithFrame:frame]); } #pragma mark - properties - (void)setSpinTime:(CGFloat)spinTime { _spinTime = spinTime; [self.circleView.layer removeRotationAnimationWithKey:kSpinAnimationKey]; if (self.isSpinning) { [self startSpin]; } } - (void)setRadius:(CGFloat)radius { self.width.constant = radius * 2; self.height.constant = radius * 2; [self setNeedsLayout]; } - (void)setLineWidth:(CGFloat)lineWidth { self.circleView.lineWidth = lineWidth; [self setNeedsDisplay]; } - (CGFloat)lineWidth { return self.circleView.lineWidth; } - (void)setEmptyLineRadians:(CGFloat)emptyLineRadians { _emptyLineRadians = emptyLineRadians; self.circleView.startAngleRadians = 1.5f * M_PI + emptyLineRadians / 2.f; self.circleView.endAngleRadians = self.circleView.startAngleRadians + 2 * M_PI - emptyLineRadians; [self setNeedsDisplay]; } - (void)setTintColor:(UIColor *)tintColor { self.circleView.tintColor = tintColor; [self setNeedsDisplay]; } #pragma mark - private methods - (PKCircleView *)createCircleView { PKCircleView *circleView = [[PKCircleView alloc] init]; NSLayoutConstraint *heightConstraint = [NSLayoutConstraint constraintForView:circleView withHeight:0.f]; NSLayoutConstraint *widthConstraint = [NSLayoutConstraint constraintForView:circleView withWidth:0.f]; [circleView addConstraints:@[heightConstraint, widthConstraint]]; self.width = widthConstraint; self.height = heightConstraint; return circleView; } - (NSArray *)createConstraints { NSMutableArray *constraints = [NSMutableArray array]; [constraints addObjectsFromArray:[NSLayoutConstraint constraintsForWrappedSubview:self.circleView withInsets:UIEdgeInsetsZero]]; return constraints; } - (void)startSpin { self.isSpinning = YES; [self.circleView.layer addRotationAnimationWithKey:kSpinAnimationKey fullRotationDuration:self.spinTime]; } - (void)stopSpin { [self.circleView.layer removeRotationAnimationWithKey:kSpinAnimationKey]; self.isSpinning = NO; } @end