Hibit_iOS/HiBit/Utils/HUD/DGActivityIndicatorView/DGActivityIndicatorView.m
2024-06-07 11:41:02 +08:00

253 lines
9.7 KiB
Objective-C
Executable File

//
// DGActivityIndicatorView.m
// DGActivityIndicatorExample
//
// Created by Danil Gontovnik on 5/23/15.
// Copyright (c) 2015 Danil Gontovnik. All rights reserved.
//
#import "DGActivityIndicatorView.h"
#import "DGActivityIndicatorNineDotsAnimation.h"
#import "DGActivityIndicatorTriplePulseAnimation.h"
#import "DGActivityIndicatorFiveDotsAnimation.h"
#import "DGActivityIndicatorRotatingSquaresAnimation.h"
#import "DGActivityIndicatorDoubleBounceAnimation.h"
#import "DGActivityIndicatorTwoDotsAnimation.h"
#import "DGActivityIndicatorThreeDotsAnimation.h"
#import "DGActivityIndicatorBallPulseAnimation.h"
#import "DGActivityIndicatorBallClipRotateAnimation.h"
#import "DGActivityIndicatorBallClipRotatePulseAnimation.h"
#import "DGActivityIndicatorBallClipRotateMultipleAnimation.h"
#import "DGActivityIndicatorBallRotateAnimation.h"
#import "DGActivityIndicatorBallZigZagAnimation.h"
#import "DGActivityIndicatorBallZigZagDeflectAnimation.h"
#import "DGActivityIndicatorBallTrianglePathAnimation.h"
#import "DGActivityIndicatorBallScaleAnimation.h"
#import "DGActivityIndicatorLineScaleAnimation.h"
#import "DGActivityIndicatorLineScalePartyAnimation.h"
#import "DGActivityIndicatorBallScaleMultipleAnimation.h"
#import "DGActivityIndicatorBallPulseSyncAnimation.h"
#import "DGActivityIndicatorBallBeatAnimation.h"
#import "DGActivityIndicatorLineScalePulseOutAnimation.h"
#import "DGActivityIndicatorLineScalePulseOutRapidAnimation.h"
#import "DGActivityIndicatorBallScaleRippleAnimation.h"
#import "DGActivityIndicatorBallScaleRippleMultipleAnimation.h"
#import "DGActivityIndicatorTriangleSkewSpinAnimation.h"
#import "DGActivityIndicatorBallGridBeatAnimation.h"
#import "DGActivityIndicatorBallGridPulseAnimation.h"
#import "DGActivityIndicatorRotatingSandglassAnimation.h"
#import "DGActivityIndicatorRotatingTrigonAnimation.h"
#import "DGActivityIndicatorTripleRingsAnimation.h"
#import "DGActivityIndicatorCookieTerminatorAnimation.h"
#import "DGActivityIndicatorBallSpinFadeLoader.h"
static const CGFloat kDGActivityIndicatorDefaultSize = 40.0f;
@interface DGActivityIndicatorView () {
CALayer *_animationLayer;
}
@end
@implementation DGActivityIndicatorView
#pragma mark -
#pragma mark Constructors
- (instancetype)initWithCoder:(NSCoder *)aDecoder {
self = [super initWithCoder:aDecoder];
if (self) {
_tintColor = [UIColor whiteColor];
_size = kDGActivityIndicatorDefaultSize;
[self commonInit];
}
return self;
}
- (id)initWithType:(DGActivityIndicatorAnimationType)type {
return [self initWithType:type tintColor:[UIColor whiteColor] size:kDGActivityIndicatorDefaultSize];
}
- (id)initWithType:(DGActivityIndicatorAnimationType)type tintColor:(UIColor *)tintColor {
return [self initWithType:type tintColor:tintColor size:kDGActivityIndicatorDefaultSize];
}
- (id)initWithType:(DGActivityIndicatorAnimationType)type tintColor:(UIColor *)tintColor size:(CGFloat)size {
self = [super init];
if (self) {
_type = type;
_size = size;
_tintColor = tintColor;
[self commonInit];
}
return self;
}
#pragma mark -
#pragma mark Methods
- (void)commonInit {
self.userInteractionEnabled = NO;
self.hidden = YES;
_animationLayer = [[CALayer alloc] init];
[self.layer addSublayer:_animationLayer];
[self setContentHuggingPriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisHorizontal];
[self setContentHuggingPriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisVertical];
}
- (void)setupAnimation {
_animationLayer.sublayers = nil;
id<DGActivityIndicatorAnimationProtocol> animation = [DGActivityIndicatorView activityIndicatorAnimationForAnimationType:_type];
if ([animation respondsToSelector:@selector(setupAnimationInLayer:withSize:tintColor:)]) {
[animation setupAnimationInLayer:_animationLayer withSize:CGSizeMake(_size, _size) tintColor:_tintColor];
_animationLayer.speed = 0.0f;
}
}
- (void)startAnimating {
if (!_animationLayer.sublayers) {
[self setupAnimation];
}
self.hidden = NO;
_animationLayer.speed = 1.0f;
_animating = YES;
}
- (void)stopAnimating {
_animationLayer.speed = 0.0f;
_animating = NO;
self.hidden = YES;
}
#pragma mark -
#pragma mark Setters
- (void)setType:(DGActivityIndicatorAnimationType)type {
if (_type != type) {
_type = type;
[self setupAnimation];
}
}
- (void)setSize:(CGFloat)size {
if (_size != size) {
_size = size;
[self setupAnimation];
[self invalidateIntrinsicContentSize];
}
}
- (void)setTintColor:(UIColor *)tintColor {
if (![_tintColor isEqual:tintColor]) {
_tintColor = tintColor;
[self setupAnimation];
}
}
#pragma mark -
#pragma mark Getters
+ (id<DGActivityIndicatorAnimationProtocol>)activityIndicatorAnimationForAnimationType:(DGActivityIndicatorAnimationType)type {
switch (type) {
case DGActivityIndicatorAnimationTypeNineDots:
return [[DGActivityIndicatorNineDotsAnimation alloc] init];
case DGActivityIndicatorAnimationTypeTriplePulse:
return [[DGActivityIndicatorTriplePulseAnimation alloc] init];
case DGActivityIndicatorAnimationTypeFiveDots:
return [[DGActivityIndicatorFiveDotsAnimation alloc] init];
case DGActivityIndicatorAnimationTypeRotatingSquares:
return [[DGActivityIndicatorRotatingSquaresAnimation alloc] init];
case DGActivityIndicatorAnimationTypeDoubleBounce:
return [[DGActivityIndicatorDoubleBounceAnimation alloc] init];
case DGActivityIndicatorAnimationTypeTwoDots:
return [[DGActivityIndicatorTwoDotsAnimation alloc] init];
case DGActivityIndicatorAnimationTypeThreeDots:
return [[DGActivityIndicatorThreeDotsAnimation alloc] init];
case DGActivityIndicatorAnimationTypeBallPulse:
return [[DGActivityIndicatorBallPulseAnimation alloc] init];
case DGActivityIndicatorAnimationTypeBallClipRotate:
return [[DGActivityIndicatorBallClipRotateAnimation alloc] init];
case DGActivityIndicatorAnimationTypeBallClipRotatePulse:
return [[DGActivityIndicatorBallClipRotatePulseAnimation alloc] init];
case DGActivityIndicatorAnimationTypeBallClipRotateMultiple:
return [[DGActivityIndicatorBallClipRotateMultipleAnimation alloc] init];
case DGActivityIndicatorAnimationTypeBallRotate:
return [[DGActivityIndicatorBallRotateAnimation alloc] init];
case DGActivityIndicatorAnimationTypeBallZigZag:
return [[DGActivityIndicatorBallZigZagAnimation alloc] init];
case DGActivityIndicatorAnimationTypeBallZigZagDeflect:
return [[DGActivityIndicatorBallZigZagDeflectAnimation alloc] init];
case DGActivityIndicatorAnimationTypeBallTrianglePath:
return [[DGActivityIndicatorBallTrianglePathAnimation alloc] init];
case DGActivityIndicatorAnimationTypeBallScale:
return [[DGActivityIndicatorBallScaleAnimation alloc] init];
case DGActivityIndicatorAnimationTypeLineScale:
return [[DGActivityIndicatorLineScaleAnimation alloc] init];
case DGActivityIndicatorAnimationTypeLineScaleParty:
return [[DGActivityIndicatorLineScalePartyAnimation alloc] init];
case DGActivityIndicatorAnimationTypeBallScaleMultiple:
return [[DGActivityIndicatorBallScaleMultipleAnimation alloc] init];
case DGActivityIndicatorAnimationTypeBallPulseSync:
return [[DGActivityIndicatorBallPulseSyncAnimation alloc] init];
case DGActivityIndicatorAnimationTypeBallBeat:
return [[DGActivityIndicatorBallBeatAnimation alloc] init];
case DGActivityIndicatorAnimationTypeLineScalePulseOut:
return [[DGActivityIndicatorLineScalePulseOutAnimation alloc] init];
case DGActivityIndicatorAnimationTypeLineScalePulseOutRapid:
return [[DGActivityIndicatorLineScalePulseOutRapidAnimation alloc] init];
case DGActivityIndicatorAnimationTypeBallScaleRipple:
return [[DGActivityIndicatorBallScaleRippleAnimation alloc] init];
case DGActivityIndicatorAnimationTypeBallScaleRippleMultiple:
return [[DGActivityIndicatorBallScaleRippleMultipleAnimation alloc] init];
case DGActivityIndicatorAnimationTypeTriangleSkewSpin:
return [[DGActivityIndicatorTriangleSkewSpinAnimation alloc] init];
case DGActivityIndicatorAnimationTypeBallGridBeat:
return [[DGActivityIndicatorBallGridBeatAnimation alloc] init];
case DGActivityIndicatorAnimationTypeBallGridPulse:
return [[DGActivityIndicatorBallGridPulseAnimation alloc] init];
case DGActivityIndicatorAnimationTypeRotatingSandglass:
return [[DGActivityIndicatorRotatingSandglassAnimation alloc]init];
case DGActivityIndicatorAnimationTypeRotatingTrigons:
return [[DGActivityIndicatorRotatingTrigonAnimation alloc]init];
case DGActivityIndicatorAnimationTypeTripleRings:
return [[DGActivityIndicatorTripleRingsAnimation alloc]init];
case DGActivityIndicatorAnimationTypeCookieTerminator:
return [[DGActivityIndicatorCookieTerminatorAnimation alloc]init];
case DGActivityIndicatorAnimationTypeBallSpinFadeLoader:
return [[DGActivityIndicatorBallSpinFadeLoader alloc] init];
}
return nil;
}
#pragma mark -
#pragma mark Layout
- (void)layoutSubviews {
[super layoutSubviews];
_animationLayer.frame = self.bounds;
BOOL animating = _animating;
if (animating)
[self stopAnimating];
[self setupAnimation];
if (animating)
[self startAnimating];
}
- (CGSize)intrinsicContentSize {
return CGSizeMake(_size, _size);
}
@end