From 7b02207537d35bfa1714bf8beafc921f717d100a Mon Sep 17 00:00:00 2001
From: 单军华
Date: Wed, 11 Jul 2018 10:47:42 +0800
Subject: [PATCH] 首次上传
---
screendisplay/Pods/M13ProgressSuite/Classes/ProgressViews/M13ProgressViewLetterpress.m | 300 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 300 insertions(+), 0 deletions(-)
diff --git a/screendisplay/Pods/M13ProgressSuite/Classes/ProgressViews/M13ProgressViewLetterpress.m b/screendisplay/Pods/M13ProgressSuite/Classes/ProgressViews/M13ProgressViewLetterpress.m
new file mode 100755
index 0000000..aeaf40d
--- /dev/null
+++ b/screendisplay/Pods/M13ProgressSuite/Classes/ProgressViews/M13ProgressViewLetterpress.m
@@ -0,0 +1,300 @@
+//
+// M13ProgressViewLetterpress.m
+// M13ProgressSuite
+//
+// Created by Brandon McQuilkin on 4/28/14.
+// Copyright (c) 2014 Brandon McQuilkin. All rights reserved.
+//
+
+#import "M13ProgressViewLetterpress.h"
+
+@interface LetterpressView : UIView
+
+@property (nonatomic, strong) M13ProgressViewLetterpress *progressView;
+@property (nonatomic, assign) CGRect drawRect;
+
+@end
+
+@interface M13ProgressViewLetterpress ()
+
+/**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;
+/**
+ The display link that controls the spring animation.
+ */
+@property (nonatomic, strong) CADisplayLink *springDisplayLink;
+
+@end
+
+@implementation M13ProgressViewLetterpress
+{
+ CGFloat rotation;
+ CGFloat restRotation;
+ CGFloat velocity;
+ LetterpressView *letterpressView;
+}
+
+- (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)dealloc
+{
+ [_springDisplayLink invalidate];
+}
+
+- (void)setup
+{
+ //Set defauts
+ self.animationDuration = 1.0;
+ _numberOfGridPoints = CGPointMake(3, 3);
+ _notchSize = CGSizeMake(1, 1);
+ _pointShape = M13ProgressViewLetterpressPointShapeCircle;
+ _pointSpacing = 0.0;
+
+ rotation = 0;
+ restRotation = 0;
+ _springConstant = 200;
+ _dampingCoefficient = 15;
+ _mass = 1;
+ velocity = 0;
+
+ //Set default colors
+ 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];
+
+ //Draw and animate a sublayer, since autolayout does not like CATransforms.
+ letterpressView = [[LetterpressView alloc] init];
+ letterpressView.backgroundColor = [UIColor clearColor];
+ letterpressView.progressView = self;
+ [self setFrame:self.frame];
+
+ [self addSubview:letterpressView];
+
+ //Set own background color
+ self.backgroundColor = [UIColor clearColor];
+ self.clipsToBounds = NO;
+
+ //Setup the display link for rotation
+ _springDisplayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(rotateWithDisplayLink:)];
+ [_springDisplayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:(id)kCFRunLoopCommonModes];
+
+}
+
+- (void)setFrame:(CGRect)frame
+{
+ [super setFrame:frame];
+ //Need to inset the layer since we don't want the corner's cliped
+ CGFloat radius = MIN(self.frame.size.width, self.frame.size.height);
+ CGFloat size = radius / sqrtf(2.0);
+ letterpressView.drawRect = CGRectIntegral(CGRectMake((self.frame.size.width - size) / 2.0, (self.frame.size.height - size) / 2.0, size, size));
+ letterpressView.frame = CGRectIntegral(CGRectMake((self.frame.size.width - size) / 2.0, (self.frame.size.height - size) / 2.0, size, size));
+}
+
+- (void)setNeedsDisplay
+{
+ [super setNeedsDisplay];
+ [letterpressView setNeedsDisplay];
+}
+
+- (CGSize)intrinsicContentSize
+{
+ //Everything is based on scale. No minimum size.
+ return CGSizeMake(UIViewNoIntrinsicMetric, UIViewNoIntrinsicMetric);
+}
+
+#pragma mark - Properties
+
+- (void)setNumberOfGridPoints:(CGPoint)numberOfGridPoints
+{
+ _numberOfGridPoints = numberOfGridPoints;
+ [self setNeedsDisplay];
+}
+
+- (void)setPointShape:(M13ProgressViewLetterpressPointShape)pointShape
+{
+ _pointShape = pointShape;
+ [self setNeedsDisplay];
+}
+
+- (void)setPointSpacing:(CGFloat)pointSpacing
+{
+ if (pointSpacing > 1) {
+ pointSpacing = 1;
+ } else if (pointSpacing < 0) {
+ pointSpacing = 0;
+ }
+ _pointSpacing = pointSpacing;
+ [self setNeedsDisplay];
+}
+
+- (void)setNotchSize:(CGSize)notchSize
+{
+ _notchSize = notchSize;
+ [self setNeedsDisplay];
+}
+
+#pragma mark - Animation
+
+- (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 setNeedsDisplay];
+ } 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 setNeedsDisplay];
+ return;
+ }
+
+ //Set progress
+ [super setProgress:self.animationFromValue + dt * (self.animationToValue - self.animationFromValue) animated:YES];
+ [self setNeedsDisplay];
+
+ });
+}
+
+- (void)rotateWithDisplayLink:(CADisplayLink *)displayLink
+{
+ //Take account for lag
+ for (int i = 0; i < displayLink.frameInterval; i++){
+
+ //Calculate the new angle
+ CGFloat displacement = rotation - restRotation;
+ CGFloat kx = _springConstant * displacement;
+ CGFloat bv = _dampingCoefficient * velocity;
+ CGFloat acceleration = (kx + bv) / _mass;
+
+ velocity -= (acceleration * displayLink.duration);
+ rotation += (velocity * displayLink.duration);
+
+ //Set the angle
+ [letterpressView setTransform:CGAffineTransformMakeRotation(rotation * M_PI / 180)];
+
+ UIView *view = [[self subviews] lastObject];
+ [view setTransform:CGAffineTransformMakeRotation(rotation * M_PI / 180)];
+
+ //If we are slowing down, animate to a new angle.
+ if (fabs(velocity) < 1) {
+ restRotation += (arc4random() & 2 ? 90 : -90);
+ }
+ }
+}
+
+@end
+
+@implementation LetterpressView
+
+#pragma mark - Drawing
+
+- (void)drawRect:(CGRect)rect
+{
+ CGContextRef ctx = UIGraphicsGetCurrentContext();
+
+ //Calculate the corners of the square of the points that we will not draw
+ CGPoint ignoreTopLeft = CGPointMake((_progressView.numberOfGridPoints.x - _progressView.notchSize.width) / 2, 0);
+ CGPoint ignoreBottomRight = CGPointMake(_progressView.numberOfGridPoints.x - ((_progressView.numberOfGridPoints.x - _progressView.notchSize.width) / 2), (_progressView.numberOfGridPoints.y - _progressView.notchSize.height) / 2);
+ //Calculate the point size
+ CGSize pointSize = CGSizeMake(_drawRect.size.width / _progressView.numberOfGridPoints.x, _drawRect.size.height / _progressView.numberOfGridPoints.y);
+
+ //Setup
+ CGRect pointRect = CGRectZero;
+ int index = -1;
+ int indexToFillTo = (int)(_progressView.numberOfGridPoints.x * _progressView.numberOfGridPoints.y * _progressView.progress);
+
+ //Draw
+ for (int y = (int)_progressView.numberOfGridPoints.y - 1; y >= 0; y--) {
+ for (int x = 0; x < _progressView.numberOfGridPoints.x; x++) {
+
+ index += 1;
+
+ //Are we in a forbidden zone
+ if (x >= ignoreTopLeft.x && x < ignoreBottomRight.x && y >= ignoreTopLeft.y && y < ignoreBottomRight.y) {
+ //Move to the next point
+ continue;
+ }
+
+ //Calculat the rect of the point
+ pointRect.size = pointSize;
+ pointRect.origin = CGPointMake(pointSize.width * x, pointSize.height * y);
+ pointRect = CGRectInset(pointRect, pointSize.width * _progressView.pointSpacing, pointSize.height * _progressView.pointSpacing);
+
+ //Set the fill color
+ if (index < indexToFillTo) {
+ CGContextSetFillColorWithColor(ctx, _progressView.primaryColor.CGColor);
+ } else {
+ CGContextSetFillColorWithColor(ctx, _progressView.secondaryColor.CGColor);
+ }
+
+ //Draw the shape
+ if (_progressView.pointShape == M13ProgressViewLetterpressPointShapeSquare) {
+ CGContextFillRect(ctx, pointRect);
+ } else if (_progressView.pointShape == M13ProgressViewLetterpressPointShapeCircle) {
+ UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:pointRect cornerRadius:(pointRect.size.width / 2.0)];
+ CGContextBeginPath(ctx);
+ CGContextAddPath(ctx, path.CGPath);
+ CGContextFillPath(ctx);
+ }
+ }
+ }
+}
+
+
+
+@end
--
Gitblit v1.8.0