Music_Player3/Pods/DownloadButton/Pod/Classes/PKPendingView.m
2024-06-03 09:48:39 +08:00

135 lines
3.8 KiB
Objective-C

//
// 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 constraintsForCenterView:self.circleView
withView:self]];
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