首次提交
21
Pods/SVProgressHUD/LICENSE
generated
Executable file
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2011-2018 Sam Vermette, Tobias Tiemerding and contributors.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
218
Pods/SVProgressHUD/README.md
generated
Executable file
@@ -0,0 +1,218 @@
|
||||
# SVProgressHUD
|
||||
|
||||

|
||||

|
||||

|
||||
[](https://github.com/Carthage/Carthage)
|
||||
[](https://cocoapods.org)
|
||||
|
||||
`SVProgressHUD` is a clean and easy-to-use HUD meant to display the progress of an ongoing task on iOS and tvOS.
|
||||
|
||||

|
||||
|
||||
## Demo
|
||||
|
||||
Try `SVProgressHUD` on [Appetize.io](https://appetize.io/app/p8r2cvy8kq74x7q7tjqf5gyatr).
|
||||
|
||||
## Installation
|
||||
|
||||
### From CocoaPods
|
||||
|
||||
[CocoaPods](http://cocoapods.org) is a dependency manager for Objective-C, which automates and simplifies the process of using 3rd-party libraries like `SVProgressHUD` in your projects. First, add the following line to your [Podfile](http://guides.cocoapods.org/using/using-cocoapods.html):
|
||||
|
||||
```ruby
|
||||
pod 'SVProgressHUD'
|
||||
```
|
||||
|
||||
If you want to use the latest features of `SVProgressHUD` use normal external source dependencies.
|
||||
|
||||
```ruby
|
||||
pod 'SVProgressHUD', :git => 'https://github.com/SVProgressHUD/SVProgressHUD.git'
|
||||
```
|
||||
|
||||
This pulls from the `master` branch directly.
|
||||
|
||||
Second, install `SVProgressHUD` into your project:
|
||||
|
||||
```ruby
|
||||
pod install
|
||||
```
|
||||
|
||||
### Carthage
|
||||
|
||||
[Carthage](https://github.com/Carthage/Carthage) is a decentralized dependency manager that builds your dependencies and provides you with binary frameworks. To integrate `SVProgressHUD` into your Xcode project using Carthage, specify it in your `Cartfile`:
|
||||
|
||||
```ogdl
|
||||
github "SVProgressHUD/SVProgressHUD"
|
||||
```
|
||||
|
||||
Run `carthage bootstrap` to build the framework in your repository's Carthage directory. You can then include it in your target's `carthage copy-frameworks` build phase. For more information on this, please see [Carthage's documentation](https://github.com/carthage/carthage#if-youre-building-for-ios-tvos-or-watchos).
|
||||
|
||||
### Manually
|
||||
|
||||
* Drag the `SVProgressHUD/SVProgressHUD` folder into your project.
|
||||
* Take care that `SVProgressHUD.bundle` is added to `Targets->Build Phases->Copy Bundle Resources`.
|
||||
* Add the **QuartzCore** framework to your project.
|
||||
|
||||
## Swift
|
||||
|
||||
Even though `SVProgressHUD` is written in Objective-C, it can be used in Swift with no hassle. If you use [CocoaPods](http://cocoapods.org) add the following line to your [Podfile](http://guides.cocoapods.org/using/using-cocoapods.html):
|
||||
|
||||
```ruby
|
||||
use_frameworks!
|
||||
```
|
||||
|
||||
If you added `SVProgressHUD` manually, just add a [bridging header](https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html) file to your project with the `SVProgressHUD` header included.
|
||||
|
||||
## Usage
|
||||
|
||||
(see sample Xcode project in `/Demo`)
|
||||
|
||||
`SVProgressHUD` is created as a singleton (i.e. it doesn't need to be explicitly allocated and instantiated; you directly call `[SVProgressHUD method]`).
|
||||
|
||||
**Use `SVProgressHUD` wisely! Only use it if you absolutely need to perform a task before taking the user forward. Bad use case examples: pull to refresh, infinite scrolling, sending message.**
|
||||
|
||||
Using `SVProgressHUD` in your app will usually look as simple as this (using Grand Central Dispatch):
|
||||
|
||||
```objective-c
|
||||
[SVProgressHUD show];
|
||||
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
|
||||
// time-consuming task
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
[SVProgressHUD dismiss];
|
||||
});
|
||||
});
|
||||
```
|
||||
|
||||
### Showing the HUD
|
||||
|
||||
You can show the status of indeterminate tasks using one of the following:
|
||||
|
||||
```objective-c
|
||||
+ (void)show;
|
||||
+ (void)showWithStatus:(NSString*)string;
|
||||
```
|
||||
|
||||
If you'd like the HUD to reflect the progress of a task, use one of these:
|
||||
|
||||
```objective-c
|
||||
+ (void)showProgress:(CGFloat)progress;
|
||||
+ (void)showProgress:(CGFloat)progress status:(NSString*)status;
|
||||
```
|
||||
|
||||
### Dismissing the HUD
|
||||
|
||||
The HUD can be dismissed using:
|
||||
|
||||
```objective-c
|
||||
+ (void)dismiss;
|
||||
+ (void)dismissWithDelay:(NSTimeInterval)delay;
|
||||
```
|
||||
|
||||
If you'd like to stack HUDs, you can balance out every show call using:
|
||||
|
||||
```
|
||||
+ (void)popActivity;
|
||||
```
|
||||
|
||||
The HUD will get dismissed once the popActivity calls will match the number of show calls.
|
||||
|
||||
Or show a confirmation glyph before before getting dismissed a little bit later. The display time depends on `minimumDismissTimeInterval` and the length of the given string.
|
||||
|
||||
```objective-c
|
||||
+ (void)showInfoWithStatus:(NSString*)string;
|
||||
+ (void)showSuccessWithStatus:(NSString*)string;
|
||||
+ (void)showErrorWithStatus:(NSString*)string;
|
||||
+ (void)showImage:(UIImage*)image status:(NSString*)string;
|
||||
```
|
||||
|
||||
## Customization
|
||||
|
||||
`SVProgressHUD` can be customized via the following methods:
|
||||
|
||||
```objective-c
|
||||
+ (void)setDefaultStyle:(SVProgressHUDStyle)style; // default is SVProgressHUDStyleLight
|
||||
+ (void)setDefaultMaskType:(SVProgressHUDMaskType)maskType; // default is SVProgressHUDMaskTypeNone
|
||||
+ (void)setDefaultAnimationType:(SVProgressHUDAnimationType)type; // default is SVProgressHUDAnimationTypeFlat
|
||||
+ (void)setContainerView:(UIView*)containerView; // default is window level
|
||||
+ (void)setMinimumSize:(CGSize)minimumSize; // default is CGSizeZero, can be used to avoid resizing
|
||||
+ (void)setRingThickness:(CGFloat)width; // default is 2 pt
|
||||
+ (void)setRingRadius:(CGFloat)radius; // default is 18 pt
|
||||
+ (void)setRingNoTextRadius:(CGFloat)radius; // default is 24 pt
|
||||
+ (void)setCornerRadius:(CGFloat)cornerRadius; // default is 14 pt
|
||||
+ (void)setBorderColor:(nonnull UIColor*)color; // default is nil
|
||||
+ (void)setBorderWidth:(CGFloat)width; // default is 0
|
||||
+ (void)setFont:(UIFont*)font; // default is [UIFont preferredFontForTextStyle:UIFontTextStyleSubheadline]
|
||||
+ (void)setForegroundColor:(UIColor*)color; // default is [UIColor blackColor], only used for SVProgressHUDStyleCustom
|
||||
+ (void)setBackgroundColor:(UIColor*)color; // default is [UIColor whiteColor], only used for SVProgressHUDStyleCustom
|
||||
+ (void)setBackgroundLayerColor:(UIColor*)color; // default is [UIColor colorWithWhite:0 alpha:0.4], only used for SVProgressHUDMaskTypeCustom
|
||||
+ (void)setImageViewSize:(CGSize)size; // default is 28x28 pt
|
||||
+ (void)setShouldTintImages:(BOOL)shouldTintImages; // default is YES
|
||||
+ (void)setInfoImage:(UIImage*)image; // default is the bundled info image provided by Freepik
|
||||
+ (void)setSuccessImage:(UIImage*)image; // default is bundled success image from Freepik
|
||||
+ (void)setErrorImage:(UIImage*)image; // default is bundled error image from Freepik
|
||||
+ (void)setViewForExtension:(UIView*)view; // default is nil, only used if #define SV_APP_EXTENSIONS is set
|
||||
+ (void)setGraceTimeInterval:(NSTimeInterval)interval; // default is 0 seconds
|
||||
+ (void)setMinimumDismissTimeInterval:(NSTimeInterval)interval; // default is 5.0 seconds
|
||||
+ (void)setMaximumDismissTimeInterval:(NSTimeInterval)interval; // default is CGFLOAT_MAX
|
||||
+ (void)setFadeInAnimationDuration:(NSTimeInterval)duration; // default is 0.15 seconds
|
||||
+ (void)setFadeOutAnimationDuration:(NSTimeInterval)duration; // default is 0.15 seconds
|
||||
+ (void)setMaxSupportedWindowLevel:(UIWindowLevel)windowLevel; // default is UIWindowLevelNormal
|
||||
+ (void)setHapticsEnabled:(BOOL)hapticsEnabled; // default is NO
|
||||
```
|
||||
|
||||
Additionally `SVProgressHUD` supports the `UIAppearance` protocol for most of the above methods.
|
||||
|
||||
### Hint
|
||||
|
||||
As standard `SVProgressHUD` offers two preconfigured styles:
|
||||
|
||||
* `SVProgressHUDStyleLight`: White background with black spinner and text
|
||||
* `SVProgressHUDStyleDark`: Black background with white spinner and text
|
||||
|
||||
If you want to use custom colors use `setForegroundColor` and `setBackgroundColor:`. These implicitly set the HUD's style to `SVProgressHUDStyleCustom`.
|
||||
|
||||
## Haptic Feedback
|
||||
|
||||
For users with newer devices (starting with the iPhone 7), `SVProgressHUD` can automatically trigger haptic feedback depending on which HUD is being displayed. The feedback maps as follows:
|
||||
|
||||
* `showSuccessWithStatus:` <-> `UINotificationFeedbackTypeSuccess`
|
||||
* `showInfoWithStatus:` <-> `UINotificationFeedbackTypeWarning`
|
||||
* `showErrorWithStatus:` <-> `UINotificationFeedbackTypeError`
|
||||
|
||||
To enable this functionality, use `setHapticsEnabled:`.
|
||||
|
||||
Users with devices prior to iPhone 7 will have no change in functionality.
|
||||
|
||||
## Notifications
|
||||
|
||||
`SVProgressHUD` posts four notifications via `NSNotificationCenter` in response to being shown/dismissed:
|
||||
* `SVProgressHUDWillAppearNotification` when the show animation starts
|
||||
* `SVProgressHUDDidAppearNotification` when the show animation completes
|
||||
* `SVProgressHUDWillDisappearNotification` when the dismiss animation starts
|
||||
* `SVProgressHUDDidDisappearNotification` when the dismiss animation completes
|
||||
|
||||
Each notification passes a `userInfo` dictionary holding the HUD's status string (if any), retrievable via `SVProgressHUDStatusUserInfoKey`.
|
||||
|
||||
`SVProgressHUD` also posts `SVProgressHUDDidReceiveTouchEventNotification` when users touch on the overall screen or `SVProgressHUDDidTouchDownInsideNotification` when a user touches on the HUD directly. For this notifications `userInfo` is not passed but the object parameter contains the `UIEvent` that related to the touch.
|
||||
|
||||
## App Extensions
|
||||
|
||||
When using `SVProgressHUD` in an App Extension, `#define SV_APP_EXTENSIONS` to avoid using unavailable APIs. Additionally call `setViewForExtension:` from your extensions view controller with `self.view`.
|
||||
|
||||
## Contributing to this project
|
||||
|
||||
If you have feature requests or bug reports, feel free to help out by sending pull requests or by [creating new issues](https://github.com/SVProgressHUD/SVProgressHUD/issues/new). Please take a moment to
|
||||
review the guidelines written by [Nicolas Gallagher](https://github.com/necolas):
|
||||
|
||||
* [Bug reports](https://github.com/necolas/issue-guidelines/blob/master/CONTRIBUTING.md#bugs)
|
||||
* [Feature requests](https://github.com/necolas/issue-guidelines/blob/master/CONTRIBUTING.md#features)
|
||||
* [Pull requests](https://github.com/necolas/issue-guidelines/blob/master/CONTRIBUTING.md#pull-requests)
|
||||
|
||||
## License
|
||||
|
||||
`SVProgressHUD` is distributed under the terms and conditions of the [MIT license](https://github.com/SVProgressHUD/SVProgressHUD/blob/master/LICENSE.txt). The success, error and info icons are made by [Freepik](http://www.freepik.com) from [Flaticon](http://www.flaticon.com) and are licensed under [Creative Commons BY 3.0](http://creativecommons.org/licenses/by/3.0/).
|
||||
|
||||
## Credits
|
||||
|
||||
`SVProgressHUD` is brought to you by [Sam Vermette](http://samvermette.com), [Tobias Tiemerding](http://tiemerding.com) and [contributors to the project](https://github.com/SVProgressHUD/SVProgressHUD/contributors). If you're using `SVProgressHUD` in your project, attribution would be very appreciated.
|
||||
17
Pods/SVProgressHUD/SVProgressHUD/SVIndefiniteAnimatedView.h
generated
Executable file
@@ -0,0 +1,17 @@
|
||||
//
|
||||
// SVIndefiniteAnimatedView.h
|
||||
// SVProgressHUD, https://github.com/SVProgressHUD/SVProgressHUD
|
||||
//
|
||||
// Copyright (c) 2014-2018 Guillaume Campagna. All rights reserved.
|
||||
//
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
|
||||
@interface SVIndefiniteAnimatedView : UIView
|
||||
|
||||
@property (nonatomic, assign) CGFloat strokeThickness;
|
||||
@property (nonatomic, assign) CGFloat radius;
|
||||
@property (nonatomic, strong) UIColor *strokeColor;
|
||||
|
||||
@end
|
||||
|
||||
137
Pods/SVProgressHUD/SVProgressHUD/SVIndefiniteAnimatedView.m
generated
Executable file
@@ -0,0 +1,137 @@
|
||||
//
|
||||
// SVIndefiniteAnimatedView.m
|
||||
// SVProgressHUD, https://github.com/SVProgressHUD/SVProgressHUD
|
||||
//
|
||||
// Copyright (c) 2014-2018 Guillaume Campagna. All rights reserved.
|
||||
//
|
||||
|
||||
#import "SVIndefiniteAnimatedView.h"
|
||||
#import "SVProgressHUD.h"
|
||||
|
||||
@interface SVIndefiniteAnimatedView ()
|
||||
|
||||
@property (nonatomic, strong) CAShapeLayer *indefiniteAnimatedLayer;
|
||||
|
||||
@end
|
||||
|
||||
@implementation SVIndefiniteAnimatedView
|
||||
|
||||
- (void)willMoveToSuperview:(UIView*)newSuperview {
|
||||
if (newSuperview) {
|
||||
[self layoutAnimatedLayer];
|
||||
} else {
|
||||
[_indefiniteAnimatedLayer removeFromSuperlayer];
|
||||
_indefiniteAnimatedLayer = nil;
|
||||
}
|
||||
}
|
||||
|
||||
- (void)layoutAnimatedLayer {
|
||||
CALayer *layer = self.indefiniteAnimatedLayer;
|
||||
[self.layer addSublayer:layer];
|
||||
|
||||
CGFloat widthDiff = CGRectGetWidth(self.bounds) - CGRectGetWidth(layer.bounds);
|
||||
CGFloat heightDiff = CGRectGetHeight(self.bounds) - CGRectGetHeight(layer.bounds);
|
||||
layer.position = CGPointMake(CGRectGetWidth(self.bounds) - CGRectGetWidth(layer.bounds) / 2 - widthDiff / 2, CGRectGetHeight(self.bounds) - CGRectGetHeight(layer.bounds) / 2 - heightDiff / 2);
|
||||
}
|
||||
|
||||
- (CAShapeLayer*)indefiniteAnimatedLayer {
|
||||
if(!_indefiniteAnimatedLayer) {
|
||||
CGPoint arcCenter = CGPointMake(self.radius+self.strokeThickness/2+5, self.radius+self.strokeThickness/2+5);
|
||||
UIBezierPath* smoothedPath = [UIBezierPath bezierPathWithArcCenter:arcCenter radius:self.radius startAngle:(CGFloat) (M_PI*3/2) endAngle:(CGFloat) (M_PI/2+M_PI*5) clockwise:YES];
|
||||
|
||||
_indefiniteAnimatedLayer = [CAShapeLayer layer];
|
||||
_indefiniteAnimatedLayer.contentsScale = [[UIScreen mainScreen] scale];
|
||||
_indefiniteAnimatedLayer.frame = CGRectMake(0.0f, 0.0f, arcCenter.x*2, arcCenter.y*2);
|
||||
_indefiniteAnimatedLayer.fillColor = [UIColor clearColor].CGColor;
|
||||
_indefiniteAnimatedLayer.strokeColor = self.strokeColor.CGColor;
|
||||
_indefiniteAnimatedLayer.lineWidth = self.strokeThickness;
|
||||
_indefiniteAnimatedLayer.lineCap = kCALineCapRound;
|
||||
_indefiniteAnimatedLayer.lineJoin = kCALineJoinBevel;
|
||||
_indefiniteAnimatedLayer.path = smoothedPath.CGPath;
|
||||
|
||||
CALayer *maskLayer = [CALayer layer];
|
||||
|
||||
NSBundle *bundle = [NSBundle bundleForClass:[SVProgressHUD class]];
|
||||
NSURL *url = [bundle URLForResource:@"SVProgressHUD" withExtension:@"bundle"];
|
||||
NSBundle *imageBundle = [NSBundle bundleWithURL:url];
|
||||
|
||||
NSString *path = [imageBundle pathForResource:@"angle-mask" ofType:@"png"];
|
||||
|
||||
maskLayer.contents = (__bridge id)[[UIImage imageWithContentsOfFile:path] CGImage];
|
||||
maskLayer.frame = _indefiniteAnimatedLayer.bounds;
|
||||
_indefiniteAnimatedLayer.mask = maskLayer;
|
||||
|
||||
NSTimeInterval animationDuration = 1;
|
||||
CAMediaTimingFunction *linearCurve = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
|
||||
|
||||
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
|
||||
animation.fromValue = (id) 0;
|
||||
animation.toValue = @(M_PI*2);
|
||||
animation.duration = animationDuration;
|
||||
animation.timingFunction = linearCurve;
|
||||
animation.removedOnCompletion = NO;
|
||||
animation.repeatCount = INFINITY;
|
||||
animation.fillMode = kCAFillModeForwards;
|
||||
animation.autoreverses = NO;
|
||||
[_indefiniteAnimatedLayer.mask addAnimation:animation forKey:@"rotate"];
|
||||
|
||||
CAAnimationGroup *animationGroup = [CAAnimationGroup animation];
|
||||
animationGroup.duration = animationDuration;
|
||||
animationGroup.repeatCount = INFINITY;
|
||||
animationGroup.removedOnCompletion = NO;
|
||||
animationGroup.timingFunction = linearCurve;
|
||||
|
||||
CABasicAnimation *strokeStartAnimation = [CABasicAnimation animationWithKeyPath:@"strokeStart"];
|
||||
strokeStartAnimation.fromValue = @0.015;
|
||||
strokeStartAnimation.toValue = @0.515;
|
||||
|
||||
CABasicAnimation *strokeEndAnimation = [CABasicAnimation animationWithKeyPath:@"strokeEnd"];
|
||||
strokeEndAnimation.fromValue = @0.485;
|
||||
strokeEndAnimation.toValue = @0.985;
|
||||
|
||||
animationGroup.animations = @[strokeStartAnimation, strokeEndAnimation];
|
||||
[_indefiniteAnimatedLayer addAnimation:animationGroup forKey:@"progress"];
|
||||
|
||||
}
|
||||
return _indefiniteAnimatedLayer;
|
||||
}
|
||||
|
||||
- (void)setFrame:(CGRect)frame {
|
||||
if(!CGRectEqualToRect(frame, super.frame)) {
|
||||
[super setFrame:frame];
|
||||
|
||||
if(self.superview) {
|
||||
[self layoutAnimatedLayer];
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
- (void)setRadius:(CGFloat)radius {
|
||||
if(radius != _radius) {
|
||||
_radius = radius;
|
||||
|
||||
[_indefiniteAnimatedLayer removeFromSuperlayer];
|
||||
_indefiniteAnimatedLayer = nil;
|
||||
|
||||
if(self.superview) {
|
||||
[self layoutAnimatedLayer];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
- (void)setStrokeColor:(UIColor*)strokeColor {
|
||||
_strokeColor = strokeColor;
|
||||
_indefiniteAnimatedLayer.strokeColor = strokeColor.CGColor;
|
||||
}
|
||||
|
||||
- (void)setStrokeThickness:(CGFloat)strokeThickness {
|
||||
_strokeThickness = strokeThickness;
|
||||
_indefiniteAnimatedLayer.lineWidth = _strokeThickness;
|
||||
}
|
||||
|
||||
- (CGSize)sizeThatFits:(CGSize)size {
|
||||
return CGSizeMake((self.radius+self.strokeThickness/2+5)*2, (self.radius+self.strokeThickness/2+5)*2);
|
||||
}
|
||||
|
||||
@end
|
||||
17
Pods/SVProgressHUD/SVProgressHUD/SVProgressAnimatedView.h
generated
Executable file
@@ -0,0 +1,17 @@
|
||||
//
|
||||
// SVProgressAnimatedView.h
|
||||
// SVProgressHUD, https://github.com/SVProgressHUD/SVProgressHUD
|
||||
//
|
||||
// Copyright (c) 2017-2018 Tobias Tiemerding. All rights reserved.
|
||||
//
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
|
||||
@interface SVProgressAnimatedView : UIView
|
||||
|
||||
@property (nonatomic, assign) CGFloat radius;
|
||||
@property (nonatomic, assign) CGFloat strokeThickness;
|
||||
@property (nonatomic, strong) UIColor *strokeColor;
|
||||
@property (nonatomic, assign) CGFloat strokeEnd;
|
||||
|
||||
@end
|
||||
96
Pods/SVProgressHUD/SVProgressHUD/SVProgressAnimatedView.m
generated
Executable file
@@ -0,0 +1,96 @@
|
||||
//
|
||||
// SVProgressAnimatedView.m
|
||||
// SVProgressHUD, https://github.com/SVProgressHUD/SVProgressHUD
|
||||
//
|
||||
// Copyright (c) 2017-2018 Tobias Tiemerding. All rights reserved.
|
||||
//
|
||||
|
||||
#import "SVProgressAnimatedView.h"
|
||||
|
||||
@interface SVProgressAnimatedView ()
|
||||
|
||||
@property (nonatomic, strong) CAShapeLayer *ringAnimatedLayer;
|
||||
|
||||
@end
|
||||
|
||||
@implementation SVProgressAnimatedView
|
||||
|
||||
- (void)willMoveToSuperview:(UIView*)newSuperview {
|
||||
if (newSuperview) {
|
||||
[self layoutAnimatedLayer];
|
||||
} else {
|
||||
[_ringAnimatedLayer removeFromSuperlayer];
|
||||
_ringAnimatedLayer = nil;
|
||||
}
|
||||
}
|
||||
|
||||
- (void)layoutAnimatedLayer {
|
||||
CALayer *layer = self.ringAnimatedLayer;
|
||||
[self.layer addSublayer:layer];
|
||||
|
||||
CGFloat widthDiff = CGRectGetWidth(self.bounds) - CGRectGetWidth(layer.bounds);
|
||||
CGFloat heightDiff = CGRectGetHeight(self.bounds) - CGRectGetHeight(layer.bounds);
|
||||
layer.position = CGPointMake(CGRectGetWidth(self.bounds) - CGRectGetWidth(layer.bounds) / 2 - widthDiff / 2, CGRectGetHeight(self.bounds) - CGRectGetHeight(layer.bounds) / 2 - heightDiff / 2);
|
||||
}
|
||||
|
||||
- (CAShapeLayer*)ringAnimatedLayer {
|
||||
if(!_ringAnimatedLayer) {
|
||||
CGPoint arcCenter = CGPointMake(self.radius+self.strokeThickness/2+5, self.radius+self.strokeThickness/2+5);
|
||||
UIBezierPath* smoothedPath = [UIBezierPath bezierPathWithArcCenter:arcCenter radius:self.radius startAngle:(CGFloat)-M_PI_2 endAngle:(CGFloat) (M_PI + M_PI_2) clockwise:YES];
|
||||
|
||||
_ringAnimatedLayer = [CAShapeLayer layer];
|
||||
_ringAnimatedLayer.contentsScale = [[UIScreen mainScreen] scale];
|
||||
_ringAnimatedLayer.frame = CGRectMake(0.0f, 0.0f, arcCenter.x*2, arcCenter.y*2);
|
||||
_ringAnimatedLayer.fillColor = [UIColor clearColor].CGColor;
|
||||
_ringAnimatedLayer.strokeColor = self.strokeColor.CGColor;
|
||||
_ringAnimatedLayer.lineWidth = self.strokeThickness;
|
||||
_ringAnimatedLayer.lineCap = kCALineCapRound;
|
||||
_ringAnimatedLayer.lineJoin = kCALineJoinBevel;
|
||||
_ringAnimatedLayer.path = smoothedPath.CGPath;
|
||||
}
|
||||
return _ringAnimatedLayer;
|
||||
}
|
||||
|
||||
- (void)setFrame:(CGRect)frame {
|
||||
if(!CGRectEqualToRect(frame, super.frame)) {
|
||||
[super setFrame:frame];
|
||||
|
||||
if(self.superview) {
|
||||
[self layoutAnimatedLayer];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
- (void)setRadius:(CGFloat)radius {
|
||||
if(radius != _radius) {
|
||||
_radius = radius;
|
||||
|
||||
[_ringAnimatedLayer removeFromSuperlayer];
|
||||
_ringAnimatedLayer = nil;
|
||||
|
||||
if(self.superview) {
|
||||
[self layoutAnimatedLayer];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
- (void)setStrokeColor:(UIColor*)strokeColor {
|
||||
_strokeColor = strokeColor;
|
||||
_ringAnimatedLayer.strokeColor = strokeColor.CGColor;
|
||||
}
|
||||
|
||||
- (void)setStrokeThickness:(CGFloat)strokeThickness {
|
||||
_strokeThickness = strokeThickness;
|
||||
_ringAnimatedLayer.lineWidth = _strokeThickness;
|
||||
}
|
||||
|
||||
- (void)setStrokeEnd:(CGFloat)strokeEnd {
|
||||
_strokeEnd = strokeEnd;
|
||||
_ringAnimatedLayer.strokeEnd = _strokeEnd;
|
||||
}
|
||||
|
||||
- (CGSize)sizeThatFits:(CGSize)size {
|
||||
return CGSizeMake((self.radius+self.strokeThickness/2+5)*2, (self.radius+self.strokeThickness/2+5)*2);
|
||||
}
|
||||
|
||||
@end
|
||||
BIN
Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/angle-mask.png
generated
Executable file
|
After Width: | Height: | Size: 1.8 KiB |
BIN
Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/angle-mask@2x.png
generated
Executable file
|
After Width: | Height: | Size: 4.8 KiB |
BIN
Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/angle-mask@3x.png
generated
Executable file
|
After Width: | Height: | Size: 8.1 KiB |
BIN
Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/error.png
generated
Executable file
|
After Width: | Height: | Size: 184 B |
BIN
Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/error@2x.png
generated
Executable file
|
After Width: | Height: | Size: 306 B |
BIN
Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/error@3x.png
generated
Executable file
|
After Width: | Height: | Size: 398 B |
BIN
Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/info.png
generated
Executable file
|
After Width: | Height: | Size: 365 B |
BIN
Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/info@2x.png
generated
Executable file
|
After Width: | Height: | Size: 816 B |
BIN
Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/info@3x.png
generated
Executable file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/success.png
generated
Executable file
|
After Width: | Height: | Size: 262 B |
BIN
Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/success@2x.png
generated
Executable file
|
After Width: | Height: | Size: 462 B |
BIN
Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/success@3x.png
generated
Executable file
|
After Width: | Height: | Size: 714 B |
147
Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.h
generated
Executable file
@@ -0,0 +1,147 @@
|
||||
//
|
||||
// SVProgressHUD.h
|
||||
// SVProgressHUD, https://github.com/SVProgressHUD/SVProgressHUD
|
||||
//
|
||||
// Copyright (c) 2011-2018 Sam Vermette and contributors. All rights reserved.
|
||||
//
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
#import <AvailabilityMacros.h>
|
||||
|
||||
extern NSString * _Nonnull const SVProgressHUDDidReceiveTouchEventNotification;
|
||||
extern NSString * _Nonnull const SVProgressHUDDidTouchDownInsideNotification;
|
||||
extern NSString * _Nonnull const SVProgressHUDWillDisappearNotification;
|
||||
extern NSString * _Nonnull const SVProgressHUDDidDisappearNotification;
|
||||
extern NSString * _Nonnull const SVProgressHUDWillAppearNotification;
|
||||
extern NSString * _Nonnull const SVProgressHUDDidAppearNotification;
|
||||
|
||||
extern NSString * _Nonnull const SVProgressHUDStatusUserInfoKey;
|
||||
|
||||
typedef NS_ENUM(NSInteger, SVProgressHUDStyle) {
|
||||
SVProgressHUDStyleLight, // default style, white HUD with black text, HUD background will be blurred
|
||||
SVProgressHUDStyleDark, // black HUD and white text, HUD background will be blurred
|
||||
SVProgressHUDStyleCustom // uses the fore- and background color properties
|
||||
};
|
||||
|
||||
typedef NS_ENUM(NSUInteger, SVProgressHUDMaskType) {
|
||||
SVProgressHUDMaskTypeNone = 1, // default mask type, allow user interactions while HUD is displayed
|
||||
SVProgressHUDMaskTypeClear, // don't allow user interactions with background objects
|
||||
SVProgressHUDMaskTypeBlack, // don't allow user interactions with background objects and dim the UI in the back of the HUD (as seen in iOS 7 and above)
|
||||
SVProgressHUDMaskTypeGradient, // don't allow user interactions with background objects and dim the UI with a a-la UIAlertView background gradient (as seen in iOS 6)
|
||||
SVProgressHUDMaskTypeCustom // don't allow user interactions with background objects and dim the UI in the back of the HUD with a custom color
|
||||
};
|
||||
|
||||
typedef NS_ENUM(NSUInteger, SVProgressHUDAnimationType) {
|
||||
SVProgressHUDAnimationTypeFlat, // default animation type, custom flat animation (indefinite animated ring)
|
||||
SVProgressHUDAnimationTypeNative // iOS native UIActivityIndicatorView
|
||||
};
|
||||
|
||||
typedef void (^SVProgressHUDShowCompletion)(void);
|
||||
typedef void (^SVProgressHUDDismissCompletion)(void);
|
||||
|
||||
@interface SVProgressHUD : UIView
|
||||
|
||||
#pragma mark - Customization
|
||||
|
||||
@property (assign, nonatomic) SVProgressHUDStyle defaultStyle UI_APPEARANCE_SELECTOR; // default is SVProgressHUDStyleLight
|
||||
@property (assign, nonatomic) SVProgressHUDMaskType defaultMaskType UI_APPEARANCE_SELECTOR; // default is SVProgressHUDMaskTypeNone
|
||||
@property (assign, nonatomic) SVProgressHUDAnimationType defaultAnimationType UI_APPEARANCE_SELECTOR; // default is SVProgressHUDAnimationTypeFlat
|
||||
@property (strong, nonatomic, nullable) UIView *containerView; // if nil then use default window level
|
||||
@property (assign, nonatomic) CGSize minimumSize UI_APPEARANCE_SELECTOR; // default is CGSizeZero, can be used to avoid resizing for a larger message
|
||||
@property (assign, nonatomic) CGFloat ringThickness UI_APPEARANCE_SELECTOR; // default is 2 pt
|
||||
@property (assign, nonatomic) CGFloat ringRadius UI_APPEARANCE_SELECTOR; // default is 18 pt
|
||||
@property (assign, nonatomic) CGFloat ringNoTextRadius UI_APPEARANCE_SELECTOR; // default is 24 pt
|
||||
@property (assign, nonatomic) CGFloat cornerRadius UI_APPEARANCE_SELECTOR; // default is 14 pt
|
||||
@property (strong, nonatomic, nonnull) UIFont *font UI_APPEARANCE_SELECTOR; // default is [UIFont preferredFontForTextStyle:UIFontTextStyleSubheadline]
|
||||
@property (strong, nonatomic, nonnull) UIColor *backgroundColor UI_APPEARANCE_SELECTOR; // default is [UIColor whiteColor]
|
||||
@property (strong, nonatomic, nonnull) UIColor *foregroundColor UI_APPEARANCE_SELECTOR; // default is [UIColor blackColor]
|
||||
@property (strong, nonatomic, nonnull) UIColor *backgroundLayerColor UI_APPEARANCE_SELECTOR;// default is [UIColor colorWithWhite:0 alpha:0.4]
|
||||
@property (assign, nonatomic) CGSize imageViewSize UI_APPEARANCE_SELECTOR; // default is 28x28 pt
|
||||
@property (assign, nonatomic) BOOL shouldTintImages UI_APPEARANCE_SELECTOR; // default is YES
|
||||
@property (strong, nonatomic, nonnull) UIImage *infoImage UI_APPEARANCE_SELECTOR; // default is the bundled info image provided by Freepik
|
||||
@property (strong, nonatomic, nonnull) UIImage *successImage UI_APPEARANCE_SELECTOR; // default is the bundled success image provided by Freepik
|
||||
@property (strong, nonatomic, nonnull) UIImage *errorImage UI_APPEARANCE_SELECTOR; // default is the bundled error image provided by Freepik
|
||||
@property (strong, nonatomic, nonnull) UIView *viewForExtension UI_APPEARANCE_SELECTOR; // default is nil, only used if #define SV_APP_EXTENSIONS is set
|
||||
@property (assign, nonatomic) NSTimeInterval graceTimeInterval; // default is 0 seconds
|
||||
@property (assign, nonatomic) NSTimeInterval minimumDismissTimeInterval; // default is 5.0 seconds
|
||||
@property (assign, nonatomic) NSTimeInterval maximumDismissTimeInterval; // default is CGFLOAT_MAX
|
||||
|
||||
@property (assign, nonatomic) UIOffset offsetFromCenter UI_APPEARANCE_SELECTOR; // default is 0, 0
|
||||
|
||||
@property (assign, nonatomic) NSTimeInterval fadeInAnimationDuration UI_APPEARANCE_SELECTOR; // default is 0.15
|
||||
@property (assign, nonatomic) NSTimeInterval fadeOutAnimationDuration UI_APPEARANCE_SELECTOR; // default is 0.15
|
||||
|
||||
@property (assign, nonatomic) UIWindowLevel maxSupportedWindowLevel; // default is UIWindowLevelNormal
|
||||
|
||||
@property (assign, nonatomic) BOOL hapticsEnabled; // default is NO
|
||||
|
||||
+ (void)setDefaultStyle:(SVProgressHUDStyle)style; // default is SVProgressHUDStyleLight
|
||||
+ (void)setDefaultMaskType:(SVProgressHUDMaskType)maskType; // default is SVProgressHUDMaskTypeNone
|
||||
+ (void)setDefaultAnimationType:(SVProgressHUDAnimationType)type; // default is SVProgressHUDAnimationTypeFlat
|
||||
+ (void)setContainerView:(nullable UIView*)containerView; // default is window level
|
||||
+ (void)setMinimumSize:(CGSize)minimumSize; // default is CGSizeZero, can be used to avoid resizing for a larger message
|
||||
+ (void)setRingThickness:(CGFloat)ringThickness; // default is 2 pt
|
||||
+ (void)setRingRadius:(CGFloat)radius; // default is 18 pt
|
||||
+ (void)setRingNoTextRadius:(CGFloat)radius; // default is 24 pt
|
||||
+ (void)setCornerRadius:(CGFloat)cornerRadius; // default is 14 pt
|
||||
+ (void)setBorderColor:(nonnull UIColor*)color; // default is nil
|
||||
+ (void)setBorderWidth:(CGFloat)width; // default is 0
|
||||
+ (void)setFont:(nonnull UIFont*)font; // default is [UIFont preferredFontForTextStyle:UIFontTextStyleSubheadline]
|
||||
+ (void)setForegroundColor:(nonnull UIColor*)color; // default is [UIColor blackColor], only used for SVProgressHUDStyleCustom
|
||||
+ (void)setBackgroundColor:(nonnull UIColor*)color; // default is [UIColor whiteColor], only used for SVProgressHUDStyleCustom
|
||||
+ (void)setBackgroundLayerColor:(nonnull UIColor*)color; // default is [UIColor colorWithWhite:0 alpha:0.5], only used for SVProgressHUDMaskTypeCustom
|
||||
+ (void)setImageViewSize:(CGSize)size; // default is 28x28 pt
|
||||
+ (void)setShouldTintImages:(BOOL)shouldTintImages; // default is YES
|
||||
+ (void)setInfoImage:(nonnull UIImage*)image; // default is the bundled info image provided by Freepik
|
||||
+ (void)setSuccessImage:(nonnull UIImage*)image; // default is the bundled success image provided by Freepik
|
||||
+ (void)setErrorImage:(nonnull UIImage*)image; // default is the bundled error image provided by Freepik
|
||||
+ (void)setViewForExtension:(nonnull UIView*)view; // default is nil, only used if #define SV_APP_EXTENSIONS is set
|
||||
+ (void)setGraceTimeInterval:(NSTimeInterval)interval; // default is 0 seconds
|
||||
+ (void)setMinimumDismissTimeInterval:(NSTimeInterval)interval; // default is 5.0 seconds
|
||||
+ (void)setMaximumDismissTimeInterval:(NSTimeInterval)interval; // default is infinite
|
||||
+ (void)setFadeInAnimationDuration:(NSTimeInterval)duration; // default is 0.15 seconds
|
||||
+ (void)setFadeOutAnimationDuration:(NSTimeInterval)duration; // default is 0.15 seconds
|
||||
+ (void)setMaxSupportedWindowLevel:(UIWindowLevel)windowLevel; // default is UIWindowLevelNormal
|
||||
+ (void)setHapticsEnabled:(BOOL)hapticsEnabled; // default is NO
|
||||
|
||||
#pragma mark - Show Methods
|
||||
|
||||
+ (void)show;
|
||||
+ (void)showWithMaskType:(SVProgressHUDMaskType)maskType __attribute__((deprecated("Use show and setDefaultMaskType: instead.")));
|
||||
+ (void)showWithStatus:(nullable NSString*)status;
|
||||
+ (void)showWithStatus:(nullable NSString*)status maskType:(SVProgressHUDMaskType)maskType __attribute__((deprecated("Use showWithStatus: and setDefaultMaskType: instead.")));
|
||||
|
||||
+ (void)showProgress:(float)progress;
|
||||
+ (void)showProgress:(float)progress maskType:(SVProgressHUDMaskType)maskType __attribute__((deprecated("Use showProgress: and setDefaultMaskType: instead.")));
|
||||
+ (void)showProgress:(float)progress status:(nullable NSString*)status;
|
||||
+ (void)showProgress:(float)progress status:(nullable NSString*)status maskType:(SVProgressHUDMaskType)maskType __attribute__((deprecated("Use showProgress:status: and setDefaultMaskType: instead.")));
|
||||
|
||||
+ (void)setStatus:(nullable NSString*)status; // change the HUD loading status while it's showing
|
||||
|
||||
// stops the activity indicator, shows a glyph + status, and dismisses the HUD a little bit later
|
||||
+ (void)showInfoWithStatus:(nullable NSString*)status;
|
||||
+ (void)showInfoWithStatus:(nullable NSString*)status maskType:(SVProgressHUDMaskType)maskType __attribute__((deprecated("Use showInfoWithStatus: and setDefaultMaskType: instead.")));
|
||||
+ (void)showSuccessWithStatus:(nullable NSString*)status;
|
||||
+ (void)showSuccessWithStatus:(nullable NSString*)status maskType:(SVProgressHUDMaskType)maskType __attribute__((deprecated("Use showSuccessWithStatus: and setDefaultMaskType: instead.")));
|
||||
+ (void)showErrorWithStatus:(nullable NSString*)status;
|
||||
+ (void)showErrorWithStatus:(nullable NSString*)status maskType:(SVProgressHUDMaskType)maskType __attribute__((deprecated("Use showErrorWithStatus: and setDefaultMaskType: instead.")));
|
||||
|
||||
// shows a image + status, use white PNGs with the imageViewSize (default is 28x28 pt)
|
||||
+ (void)showImage:(nonnull UIImage*)image status:(nullable NSString*)status;
|
||||
+ (void)showImage:(nonnull UIImage*)image status:(nullable NSString*)status maskType:(SVProgressHUDMaskType)maskType __attribute__((deprecated("Use showImage:status: and setDefaultMaskType: instead.")));
|
||||
|
||||
+ (void)setOffsetFromCenter:(UIOffset)offset;
|
||||
+ (void)resetOffsetFromCenter;
|
||||
|
||||
+ (void)popActivity; // decrease activity count, if activity count == 0 the HUD is dismissed
|
||||
+ (void)dismiss;
|
||||
+ (void)dismissWithCompletion:(nullable SVProgressHUDDismissCompletion)completion;
|
||||
+ (void)dismissWithDelay:(NSTimeInterval)delay;
|
||||
+ (void)dismissWithDelay:(NSTimeInterval)delay completion:(nullable SVProgressHUDDismissCompletion)completion;
|
||||
|
||||
+ (BOOL)isVisible;
|
||||
|
||||
+ (NSTimeInterval)displayDurationForString:(nullable NSString*)string;
|
||||
|
||||
@end
|
||||
|
||||
1509
Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.m
generated
Executable file
14
Pods/SVProgressHUD/SVProgressHUD/SVRadialGradientLayer.h
generated
Executable file
@@ -0,0 +1,14 @@
|
||||
//
|
||||
// SVRadialGradientLayer.h
|
||||
// SVProgressHUD, https://github.com/SVProgressHUD/SVProgressHUD
|
||||
//
|
||||
// Copyright (c) 2014-2018 Tobias Tiemerding. All rights reserved.
|
||||
//
|
||||
|
||||
#import <QuartzCore/QuartzCore.h>
|
||||
|
||||
@interface SVRadialGradientLayer : CALayer
|
||||
|
||||
@property (nonatomic) CGPoint gradientCenter;
|
||||
|
||||
@end
|
||||
25
Pods/SVProgressHUD/SVProgressHUD/SVRadialGradientLayer.m
generated
Executable file
@@ -0,0 +1,25 @@
|
||||
//
|
||||
// SVRadialGradientLayer.m
|
||||
// SVProgressHUD, https://github.com/SVProgressHUD/SVProgressHUD
|
||||
//
|
||||
// Copyright (c) 2014-2018 Tobias Tiemerding. All rights reserved.
|
||||
//
|
||||
|
||||
#import "SVRadialGradientLayer.h"
|
||||
|
||||
@implementation SVRadialGradientLayer
|
||||
|
||||
- (void)drawInContext:(CGContextRef)context {
|
||||
size_t locationsCount = 2;
|
||||
CGFloat locations[2] = {0.0f, 1.0f};
|
||||
CGFloat colors[8] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.75f};
|
||||
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
|
||||
CGGradientRef gradient = CGGradientCreateWithColorComponents(colorSpace, colors, locations, locationsCount);
|
||||
CGColorSpaceRelease(colorSpace);
|
||||
|
||||
float radius = MIN(self.bounds.size.width , self.bounds.size.height);
|
||||
CGContextDrawRadialGradient (context, gradient, self.gradientCenter, 0, self.gradientCenter, radius, kCGGradientDrawsAfterEndLocation);
|
||||
CGGradientRelease(gradient);
|
||||
}
|
||||
|
||||
@end
|
||||