123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 |
- //
- // PKCircleProgressView.m
- // PKDownloadButton
- //
- // Created by Pavel on 28/05/15.
- // Copyright (c) 2015 Katunin. All rights reserved.
- //
- #import "PKCircleProgressView.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 constraintsForWrappedSubview:self.filledLineCircleView
- withInsets:UIEdgeInsetsZero]];
- return constraints;
- }
- @end
|