123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233 |
- /*
- * This file is part of the SDWebImage package.
- * (c) Olivier Poitrey <rs@dailymotion.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- #import "SDWebImageIndicator.h"
- #if SD_UIKIT || SD_MAC
- #if SD_MAC
- #import <QuartzCore/QuartzCore.h>
- #endif
- #pragma mark - Activity Indicator
- @interface SDWebImageActivityIndicator ()
- #if SD_UIKIT
- @property (nonatomic, strong, readwrite, nonnull) UIActivityIndicatorView *indicatorView;
- #else
- @property (nonatomic, strong, readwrite, nonnull) NSProgressIndicator *indicatorView;
- #endif
- @end
- @implementation SDWebImageActivityIndicator
- - (instancetype)init {
- self = [super init];
- if (self) {
- [self commonInit];
- }
- return self;
- }
- #if SD_UIKIT
- - (void)commonInit {
- self.indicatorView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite];
- self.indicatorView.autoresizingMask = UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleBottomMargin;
- }
- #endif
- #if SD_MAC
- - (void)commonInit {
- self.indicatorView = [[NSProgressIndicator alloc] initWithFrame:NSZeroRect];
- self.indicatorView.style = NSProgressIndicatorStyleSpinning;
- self.indicatorView.controlSize = NSControlSizeSmall;
- [self.indicatorView sizeToFit];
- self.indicatorView.autoresizingMask = NSViewMaxXMargin | NSViewMinXMargin | NSViewMaxYMargin | NSViewMinYMargin;
- }
- #endif
- - (void)startAnimatingIndicator {
- #if SD_UIKIT
- [self.indicatorView startAnimating];
- #else
- [self.indicatorView startAnimation:nil];
- #endif
- self.indicatorView.hidden = NO;
- }
- - (void)stopAnimatingIndicator {
- #if SD_UIKIT
- [self.indicatorView stopAnimating];
- #else
- [self.indicatorView stopAnimation:nil];
- #endif
- self.indicatorView.hidden = YES;
- }
- @end
- @implementation SDWebImageActivityIndicator (Conveniences)
- + (SDWebImageActivityIndicator *)grayIndicator {
- SDWebImageActivityIndicator *indicator = [SDWebImageActivityIndicator new];
- #if SD_UIKIT
- #if SD_IOS
- indicator.indicatorView.activityIndicatorViewStyle = UIActivityIndicatorViewStyleGray;
- #else
- indicator.indicatorView.color = [UIColor colorWithWhite:0 alpha:0.45]; // Color from `UIActivityIndicatorViewStyleGray`
- #endif
- #endif
- return indicator;
- }
- + (SDWebImageActivityIndicator *)grayLargeIndicator {
- SDWebImageActivityIndicator *indicator = SDWebImageActivityIndicator.grayIndicator;
- #if SD_UIKIT
- UIColor *grayColor = indicator.indicatorView.color;
- indicator.indicatorView.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhiteLarge;
- indicator.indicatorView.color = grayColor;
- #else
- indicator.indicatorView.controlSize = NSControlSizeRegular;
- #endif
- [indicator.indicatorView sizeToFit];
- return indicator;
- }
- + (SDWebImageActivityIndicator *)whiteIndicator {
- SDWebImageActivityIndicator *indicator = [SDWebImageActivityIndicator new];
- #if SD_UIKIT
- indicator.indicatorView.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhite;
- #else
- CIFilter *lighten = [CIFilter filterWithName:@"CIColorControls"];
- [lighten setDefaults];
- [lighten setValue:@(1) forKey:kCIInputBrightnessKey];
- indicator.indicatorView.contentFilters = @[lighten];
- #endif
- return indicator;
- }
- + (SDWebImageActivityIndicator *)whiteLargeIndicator {
- SDWebImageActivityIndicator *indicator = SDWebImageActivityIndicator.whiteIndicator;
- #if SD_UIKIT
- indicator.indicatorView.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhiteLarge;
- #else
- indicator.indicatorView.controlSize = NSControlSizeRegular;
- [indicator.indicatorView sizeToFit];
- #endif
- return indicator;
- }
- @end
- #pragma mark - Progress Indicator
- @interface SDWebImageProgressIndicator ()
- #if SD_UIKIT
- @property (nonatomic, strong, readwrite, nonnull) UIProgressView *indicatorView;
- #else
- @property (nonatomic, strong, readwrite, nonnull) NSProgressIndicator *indicatorView;
- #endif
- @end
- @implementation SDWebImageProgressIndicator
- - (instancetype)init {
- self = [super init];
- if (self) {
- [self commonInit];
- }
- return self;
- }
- #if SD_UIKIT
- - (void)commonInit {
- self.indicatorView = [[UIProgressView alloc] initWithProgressViewStyle:UIProgressViewStyleDefault];
- self.indicatorView.autoresizingMask = UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleBottomMargin;
- }
- #endif
- #if SD_MAC
- - (void)commonInit {
- self.indicatorView = [[NSProgressIndicator alloc] initWithFrame:NSMakeRect(0, 0, 160, 0)]; // Width from `UIProgressView` default width
- self.indicatorView.style = NSProgressIndicatorStyleBar;
- self.indicatorView.controlSize = NSControlSizeSmall;
- [self.indicatorView sizeToFit];
- self.indicatorView.autoresizingMask = NSViewMaxXMargin | NSViewMinXMargin | NSViewMaxYMargin | NSViewMinYMargin;
- }
- #endif
- #pragma clang diagnostic push
- #pragma clang diagnostic ignored "-Wunguarded-availability"
- - (void)startAnimatingIndicator {
- self.indicatorView.hidden = NO;
- #if SD_UIKIT
- if ([self.indicatorView respondsToSelector:@selector(observedProgress)] && self.indicatorView.observedProgress) {
- // Ignore NSProgress
- } else {
- self.indicatorView.progress = 0;
- }
- #else
- self.indicatorView.indeterminate = YES;
- self.indicatorView.doubleValue = 0;
- [self.indicatorView startAnimation:nil];
- #endif
- }
- - (void)stopAnimatingIndicator {
- self.indicatorView.hidden = YES;
- #if SD_UIKIT
- if ([self.indicatorView respondsToSelector:@selector(observedProgress)] && self.indicatorView.observedProgress) {
- // Ignore NSProgress
- } else {
- self.indicatorView.progress = 1;
- }
- #else
- self.indicatorView.indeterminate = NO;
- self.indicatorView.doubleValue = 100;
- [self.indicatorView stopAnimation:nil];
- #endif
- }
- - (void)updateIndicatorProgress:(double)progress {
- #if SD_UIKIT
- if ([self.indicatorView respondsToSelector:@selector(observedProgress)] && self.indicatorView.observedProgress) {
- // Ignore NSProgress
- } else {
- [self.indicatorView setProgress:progress animated:YES];
- }
- #else
- self.indicatorView.indeterminate = progress > 0 ? NO : YES;
- self.indicatorView.doubleValue = progress * 100;
- #endif
- }
- #pragma clang diagnostic pop
- @end
- @implementation SDWebImageProgressIndicator (Conveniences)
- + (SDWebImageProgressIndicator *)defaultIndicator {
- SDWebImageProgressIndicator *indicator = [SDWebImageProgressIndicator new];
- return indicator;
- }
- #if SD_IOS
- + (SDWebImageProgressIndicator *)barIndicator {
- SDWebImageProgressIndicator *indicator = [SDWebImageProgressIndicator new];
- indicator.indicatorView.progressViewStyle = UIProgressViewStyleBar;
- return indicator;
- }
- #endif
- @end
- #endif
|