234 lines
6.8 KiB
Objective-C
234 lines
6.8 KiB
Objective-C
/*
|
|
* 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
|