Music_Player3/Pods/DownloadButton/Pod/Classes/PKCircleProgressView.m
2024-05-29 17:31:45 +08:00

182 lines
6.3 KiB
Objective-C

//
// PKCircleProgressView.m
// PKDownloadButton
//
// Created by Pavel on 28/05/15.
// Copyright (c) 2015 Katunin. All rights reserved.
//
#import "PKCircleProgressView.h"
#import "UIColor+PKDownloadButton.h"
#import "PKCircleView.h"
#import "NSLayoutConstraint+PKDownloadButton.h"
static const CGFloat kDefaultRaduis = 13.f;
static const CGFloat kDefaultFilledLineWidth = 3.f;
static const CGFloat kDefaultEmptyLineWidth = 1.f;
static const CGFloat kStartAngle = M_PI * 1.5;
@interface PKCircleProgressView ()
@property (nonatomic, assign) CGFloat startAngle;
@property (nonatomic, assign) CGFloat endAngle;
@property (nonatomic, weak) PKCircleView *emptyLineCircleView;
@property (nonatomic, weak) PKCircleView *filledLineCircleView;
@property (nonatomic, weak) NSLayoutConstraint *emptyLineCircleWidth;
@property (nonatomic, weak) NSLayoutConstraint *emptyLineCircleHeight;
@property (nonatomic, weak) NSLayoutConstraint *filledLineCircleWidth;
@property (nonatomic, weak) NSLayoutConstraint *filledLineCircleHeight;
@property (nonatomic, assign) CGFloat emptyLineCircleSize;
@property (nonatomic, assign) CGFloat filledLineCircleSize;
- (PKCircleView *)createEmptyLineCircleView;
- (PKCircleView *)createFilledLineCircleView;
- (NSArray *)createCircleConstraints;
@end
static PKCircleProgressView *CommonInit(PKCircleProgressView *self) {
if (self != nil) {
self.backgroundColor = [UIColor clearColor];
self.startAngle = kStartAngle;
self.endAngle = self.startAngle + (M_PI * 2);
self.clipsToBounds = NO;
PKCircleView *emptyLineCircleView = [self createEmptyLineCircleView];
self.emptyLineCircleView = emptyLineCircleView;
emptyLineCircleView.translatesAutoresizingMaskIntoConstraints = NO;
[self addSubview:emptyLineCircleView];
PKCircleView *filledLineCircleView = [self createFilledLineCircleView];
self.filledLineCircleView = filledLineCircleView;
filledLineCircleView.translatesAutoresizingMaskIntoConstraints = NO;
[self addSubview:filledLineCircleView];
[self addConstraints:[self createCircleConstraints]];
self.emptyLineWidth = kDefaultEmptyLineWidth;
self.filledLineWidth = kDefaultFilledLineWidth;
self.radius = kDefaultRaduis;
}
return self;
}
@implementation PKCircleProgressView
#pragma mark - initilaization / deallocation
- (id)initWithCoder:(NSCoder *)decoder {
return CommonInit([super initWithCoder:decoder]);
}
- (instancetype)initWithFrame:(CGRect)frame {
return CommonInit([super initWithFrame:frame]);
}
#pragma mark - properties
- (void)setEmptyLineCircleSize:(CGFloat)emptyLineCircleSize {
self.emptyLineCircleWidth.constant = emptyLineCircleSize;
self.emptyLineCircleHeight.constant = emptyLineCircleSize;
}
- (void)setFilledLineCircleSize:(CGFloat)filledLineCircleSize {
self.filledLineCircleWidth.constant = filledLineCircleSize;
self.filledLineCircleHeight.constant = filledLineCircleSize;
}
- (void)setProgress:(CGFloat)progress {
_progress = progress;
self.filledLineCircleView.startAngleRadians = self.startAngle;
self.filledLineCircleView.endAngleRadians = (self.endAngle - self.startAngle) * progress + self.startAngle;
[self setNeedsDisplay];
}
- (void)setFilledLineWidth:(CGFloat)filledLineWidth {
_filledLineWidth = filledLineWidth;
self.filledLineCircleView.lineWidth = filledLineWidth;
[self setNeedsUpdateConstraints];
}
- (void)setEmptyLineWidth:(CGFloat)emptyLineWidth {
_emptyLineWidth = emptyLineWidth;
self.emptyLineCircleView.lineWidth = emptyLineWidth;
[self setNeedsUpdateConstraints];
}
- (void)setRadius:(CGFloat)radius {
_radius = radius;
[self setNeedsUpdateConstraints];
}
- (void)setFilledLineStyleOuter:(BOOL)filledLineStyleOuter {
_filledLineStyleOuter = filledLineStyleOuter;
[self setNeedsUpdateConstraints];
}
#pragma mark - UIView
- (void)updateConstraints {
[super updateConstraints];
self.emptyLineCircleSize = self.radius * 2.f;
CGFloat deltaRaduis = 0.f;
if (self.filledLineStyleOuter) {
deltaRaduis = - self.emptyLineCircleView.lineWidth / 2.f + self.filledLineCircleView.lineWidth;
}
else {
deltaRaduis = - self.emptyLineCircleView.lineWidth / 2.f;
}
self.filledLineCircleSize = self.radius * 2.f + deltaRaduis * 2.f;
}
#pragma mark - private methods
- (PKCircleView *)createEmptyLineCircleView {
PKCircleView *emptyCircelView = [[PKCircleView alloc] init];
NSLayoutConstraint *widthConstraint = [NSLayoutConstraint constraintForView:emptyCircelView
withWidth:0.f];
self.emptyLineCircleWidth = widthConstraint;
[emptyCircelView addConstraint:widthConstraint];
NSLayoutConstraint *heightConstraint = [NSLayoutConstraint constraintForView:emptyCircelView
withHeight:0.f];
self.emptyLineCircleHeight = heightConstraint;
[emptyCircelView addConstraint:heightConstraint];
return emptyCircelView;
}
- (PKCircleView *)createFilledLineCircleView {
PKCircleView *filledCircelView = [[PKCircleView alloc] init];
NSLayoutConstraint *widthConstraint = [NSLayoutConstraint constraintForView:filledCircelView
withWidth:0.f];
self.filledLineCircleWidth = widthConstraint;
[filledCircelView addConstraint:widthConstraint];
NSLayoutConstraint *heightConstraint = [NSLayoutConstraint constraintForView:filledCircelView
withHeight:0.f];
self.filledLineCircleHeight = heightConstraint;
[filledCircelView addConstraint:heightConstraint];
return filledCircelView;
}
- (NSArray *)createCircleConstraints {
NSMutableArray *constraints = [NSMutableArray array];
[constraints addObjectsFromArray:[NSLayoutConstraint constraintsForCenterView:self.emptyLineCircleView
withView:self]];
[constraints addObjectsFromArray:[NSLayoutConstraint constraintsForCenterView:self.filledLineCircleView
withView:self]];
return constraints;
}
@end