/* * This file is part of the SDWebImage package. * (c) Olivier Poitrey * * 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 #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