From 83b9d5c682b21d88133f24da0f94dd56bd79e687 Mon Sep 17 00:00:00 2001 From: 单军华 Date: Thu, 19 Jul 2018 13:38:55 +0800 Subject: [PATCH] change --- screendisplay/Pods/M13ProgressSuite/Classes/ProgressViews/M13ProgressViewMetro.m | 378 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 378 insertions(+), 0 deletions(-) diff --git a/screendisplay/Pods/M13ProgressSuite/Classes/ProgressViews/M13ProgressViewMetro.m b/screendisplay/Pods/M13ProgressSuite/Classes/ProgressViews/M13ProgressViewMetro.m new file mode 100755 index 0000000..b292688 --- /dev/null +++ b/screendisplay/Pods/M13ProgressSuite/Classes/ProgressViews/M13ProgressViewMetro.m @@ -0,0 +1,378 @@ +// +// M13ProgressViewMetro.m +// M13ProgressSuite +// +// Created by Brandon McQuilkin on 3/8/14. +// Copyright (c) 2014 Brandon McQuilkin. All rights reserved. +// + +#import "M13ProgressViewMetro.h" +#import "M13ProgressViewMetroDotPolygon.h" + +@interface M13ProgressViewMetro () + +/**The start progress for the progress animation.*/ +@property (nonatomic, assign) CGFloat animationFromValue; +/**The end progress for the progress animation.*/ +@property (nonatomic, assign) CGFloat animationToValue; +/**The start time interval for the animaiton.*/ +@property (nonatomic, assign) CFTimeInterval animationStartTime; +/**Link to the display to keep animations in sync.*/ +@property (nonatomic, strong) CADisplayLink *displayLink; + +@end + +@implementation M13ProgressViewMetroDot +{ + M13ProgressViewAction currentAction; +} + +#pragma mark Initalization + +- (id)init +{ + self = [super init]; + if (self) { + [self setup]; + } + return self; +} + +- (id)initWithCoder:(NSCoder *)aDecoder +{ + self = [super initWithCoder:aDecoder]; + if (self) { + [self setup]; + } + return self; +} + +- (id)initWithLayer:(id)layer +{ + self = [super initWithLayer:layer]; + if (self) { + [self setup]; + } + return self; +} + ++ (id)layer +{ + return [[M13ProgressViewMetroDot alloc] init]; +} + +- (void)setup +{ + _highlighted = NO; + currentAction = M13ProgressViewActionNone; + _primaryColor = [UIColor colorWithRed:0 green:122/255.0 blue:1.0 alpha:1.0]; + _secondaryColor = [UIColor colorWithRed:181/255.0 green:182/255.0 blue:183/255.0 alpha:1.0]; + _successColor = [UIColor colorWithRed:63.0f/255.0f green:226.0f/255.0f blue:80.0f/255.0f alpha:1]; + _failureColor = [UIColor colorWithRed:249.0f/255.0f green:37.0f/255.0f blue:0 alpha:1]; +} + +#pragma mark Setters + +- (void)setHighlighted:(BOOL)highlighted +{ + _highlighted = highlighted; + [self setNeedsDisplay]; +} + +- (void)setSuccessColor:(UIColor *)successColor +{ + _successColor = successColor; + [self setNeedsDisplay]; +} + +- (void)setFailureColor:(UIColor *)failureColor +{ + _failureColor = failureColor; + [self setNeedsDisplay]; +} + +- (void)setPrimaryColor:(UIColor *)primaryColor +{ + _primaryColor = primaryColor; + [self setNeedsDisplay]; +} + +- (void)setSecondaryColor:(UIColor *)secondaryColor +{ + _secondaryColor = secondaryColor; + [self setNeedsDisplay]; +} + +- (void)performAction:(M13ProgressViewAction)action animated:(BOOL)animated +{ + currentAction = action; + [self setNeedsDisplay]; +} + +@end + +@implementation M13ProgressViewMetro +{ + BOOL animating; + NSUInteger currentNumberOfDots; + NSTimer *animationTimer; + UIBezierPath *animationPath; + NSMutableArray *dots; + + CGFloat circleSize; +} + +- (id)init +{ + self = [super init]; + if (self) { + [self setup]; + } + return self; +} + +- (id)initWithFrame:(CGRect)frame +{ + self = [super initWithFrame:frame]; + if (self) { + [self setup]; + } + return self; +} + +- (id)initWithCoder:(NSCoder *)aDecoder +{ + self = [super initWithCoder:aDecoder]; + if (self) { + [self setup]; + } + return self; +} + +- (void)setup +{ + //Set defaults + self.clipsToBounds = YES; + animating = NO; + _numberOfDots = 6; + _dotSize = CGSizeMake(20, 20); + self.animationDuration = 1.5; + self.animationShape = M13ProgressViewMetroAnimationShapeEllipse; + self.primaryColor = [UIColor colorWithRed:0 green:122/255.0 blue:1.0 alpha:1.0]; + self.secondaryColor = [UIColor colorWithRed:181/255.0 green:182/255.0 blue:183/255.0 alpha:1.0]; + _successColor = [UIColor colorWithRed:63.0f/255.0f green:226.0f/255.0f blue:80.0f/255.0f alpha:1]; + _failureColor = [UIColor colorWithRed:249.0f/255.0f green:37.0f/255.0f blue:0 alpha:1]; + _metroDot = [[M13ProgressViewMetroDotPolygon alloc] init]; +} + +#pragma mark Properties + +- (void)setFrame:(CGRect)frame +{ + [super setFrame:frame]; + if (animating) { + [self stopAnimating]; + [self beginAnimating]; + } +} + +- (BOOL)isAnimating +{ + return animating; +} + +- (void)setAnimationShape:(M13ProgressViewMetroAnimationShape)animationShape +{ + _animationShape = animationShape; + if (_animationShape == M13ProgressViewMetroAnimationShapeEllipse) { + //Inset the size of the dot + CGFloat radius = MIN((self.bounds.size.width - _dotSize.width) / 2, (self.bounds.size.height - _dotSize.height) / 2); + //Create the path + animationPath = [UIBezierPath bezierPathWithArcCenter:CGPointMake(self.bounds.size.width / 2, self.bounds.size.height / 2) radius:radius startAngle:M_PI_2 endAngle:(-M_PI_2 * 3) clockwise:YES]; + } else if (_animationShape == M13ProgressViewMetroAnimationShapeRectangle) { + //Inset the size of the dot + CGRect pathRect = CGRectInset(self.bounds, _dotSize.width, _dotSize.height); + //Create the path + animationPath = [UIBezierPath bezierPath]; + [animationPath moveToPoint:CGPointMake((pathRect.size.width / 2) + pathRect.origin.x, pathRect.size.height + pathRect.origin.y)]; + [animationPath addLineToPoint:CGPointMake(pathRect.origin.x, pathRect.size.height + pathRect.origin.y)]; + [animationPath addLineToPoint:CGPointMake(pathRect.origin.x, pathRect.origin.y)]; + [animationPath addLineToPoint:CGPointMake(pathRect.origin.x + pathRect.size.width, pathRect.origin.y)]; + [animationPath addLineToPoint:CGPointMake(pathRect.origin.x + pathRect.size.width, pathRect.origin.y + pathRect.size.height)]; + [animationPath moveToPoint:CGPointMake((pathRect.size.width / 2) + pathRect.origin.x, pathRect.size.height + pathRect.origin.y)]; + } else if (animationShape == M13ProgressViewMetroAnimationShapeLine) { + //Create the path + animationPath = [UIBezierPath bezierPath]; + [animationPath moveToPoint:CGPointMake(-_dotSize.width, self.bounds.size.height / 2)]; + [animationPath addLineToPoint:CGPointMake(self.bounds.size.width + _dotSize.width, self.bounds.size.height / 2)]; + } + [self stopAnimating]; + [self beginAnimating]; +} + +- (void)setNumberOfDots:(NSUInteger)numberOfDots +{ + _numberOfDots = numberOfDots; + [self invalidateIntrinsicContentSize]; + [self stopAnimating]; + [self beginAnimating]; +} + +- (void)setDotSize:(CGSize)dotSize +{ + _dotSize = dotSize; + [self invalidateIntrinsicContentSize]; + [self stopAnimating]; + [self beginAnimating]; +} + +- (void)performAction:(M13ProgressViewAction)action animated:(BOOL)animated +{ + for (M13ProgressViewMetroDot *dot in dots) { + [dot performAction:action animated:animated]; + } +} + +- (void)setProgress:(CGFloat)progress animated:(BOOL)animated +{ + if (animated == NO) { + if (_displayLink) { + //Kill running animations + [_displayLink invalidate]; + _displayLink = nil; + } + [super setProgress:progress animated:NO]; + [self showProgress]; + } else { + _animationStartTime = CACurrentMediaTime(); + _animationFromValue = self.progress; + _animationToValue = progress; + if (!_displayLink) { + //Create and setup the display link + [self.displayLink invalidate]; + self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(animateProgress:)]; + [self.displayLink addToRunLoop:NSRunLoop.mainRunLoop forMode:NSRunLoopCommonModes]; + } /*else { + //Reuse the current display link + }*/ + } +} + +- (void)animateProgress:(CADisplayLink *)displayLink +{ + dispatch_async(dispatch_get_main_queue(), ^{ + CGFloat dt = (displayLink.timestamp - self.animationStartTime) / self.animationDuration; + if (dt >= 1.0) { + //Order is important! Otherwise concurrency will cause errors, because setProgress: will detect an animation in progress and try to stop it by itself. Once over one, set to actual progress amount. Animation is over. + [self.displayLink invalidate]; + self.displayLink = nil; + [super setProgress:self.animationToValue animated:NO]; + [self showProgress]; + return; + } + + //Set progress + [super setProgress:self.animationFromValue + dt * (self.animationToValue - self.animationFromValue) animated:YES]; + [self showProgress]; + + }); +} + +- (void)showProgress +{ + static int pastIndexToHighlightTo = 0; + int indexToHighlightTo = (int)ceilf(_numberOfDots * (float)self.progress); + //Only perform the animation if necessary. + if (pastIndexToHighlightTo != indexToHighlightTo) { + for (int i = 0; i < _numberOfDots; i++) { + M13ProgressViewMetroDot *dot = dots[i]; + if (i <= indexToHighlightTo && self.progress != 0) { + dot.highlighted = YES; + } else { + dot.highlighted = NO; + } + } + pastIndexToHighlightTo = indexToHighlightTo; + } +} + +- (CGSize)intrinsicContentSize +{ + //No real constraint on size. + if (_animationShape == M13ProgressViewMetroAnimationShapeEllipse || _animationShape == M13ProgressViewMetroAnimationShapeRectangle) { + return CGSizeMake(3 * _dotSize.width, 3 * _dotSize.height); + } else { + return CGSizeMake(_dotSize.width * _numberOfDots, _dotSize.height); + } +} + +#pragma mark Animation + +-(void)beginAnimating +{ + if (!animating){ + + animating = YES; + + currentNumberOfDots = 0; + dots = [[NSMutableArray alloc] init]; + + //add circles + animationTimer = [NSTimer scheduledTimerWithTimeInterval: 0.20 target: self + selector: @selector(createCircle) userInfo: nil repeats: YES]; + } +} + +-(void)createCircle +{ + if (currentNumberOfDots<_numberOfDots){ + + currentNumberOfDots ++; + CGRect f; + if (_animationShape != M13ProgressViewMetroAnimationShapeLine) { + f = CGRectMake((self.frame.size.width - _dotSize.width) / 2 - 1, self.frame.size.height - _dotSize.height - 1, _dotSize.width, _dotSize.height); + } else { + f = CGRectMake(- _dotSize.width, self.bounds.size.height / 2, _dotSize.width, _dotSize.height); + } + M13ProgressViewMetroDot *dotLayer = [_metroDot copy]; + dotLayer.frame = f; + [self.layer addSublayer:dotLayer]; + [dots addObject:dotLayer]; + + CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"position"]; + animation.duration = self.animationDuration; + animation.timingFunction = [CAMediaTimingFunction functionWithControlPoints:0.15f :0.60f :0.85f :0.4f]; + [animation setCalculationMode:kCAAnimationPaced]; + animation.path = animationPath.CGPath; + animation.repeatCount = HUGE_VALF; + + if (_animationShape != M13ProgressViewMetroAnimationShapeLine) { + //No delay needed + [dotLayer addAnimation:animation forKey:@"metroAnimation"]; + } else { + //Delay repeat + animation.repeatCount = 1; + CAAnimationGroup *group = [CAAnimationGroup animation]; + group.duration = self.animationDuration * 2; + group.animations = @[animation]; + group.repeatCount = HUGE_VALF; + [dotLayer addAnimation:group forKey:@"metroAnimation"]; + } + + + } else { + [animationTimer invalidate]; + } +} + +-(void)stopAnimating +{ + animating = NO; + [animationTimer invalidate]; + for (CALayer *layer in dots) { + [layer removeAllAnimations]; + [layer removeFromSuperlayer]; + } +} + +@end -- Gitblit v1.8.0