SDWebImageIndicator.m 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. /*
  2. * This file is part of the SDWebImage package.
  3. * (c) Olivier Poitrey <rs@dailymotion.com>
  4. *
  5. * For the full copyright and license information, please view the LICENSE
  6. * file that was distributed with this source code.
  7. */
  8. #import "SDWebImageIndicator.h"
  9. #if SD_UIKIT || SD_MAC
  10. #if SD_MAC
  11. #import <QuartzCore/QuartzCore.h>
  12. #endif
  13. #pragma mark - Activity Indicator
  14. @interface SDWebImageActivityIndicator ()
  15. #if SD_UIKIT
  16. @property (nonatomic, strong, readwrite, nonnull) UIActivityIndicatorView *indicatorView;
  17. #else
  18. @property (nonatomic, strong, readwrite, nonnull) NSProgressIndicator *indicatorView;
  19. #endif
  20. @end
  21. @implementation SDWebImageActivityIndicator
  22. - (instancetype)init {
  23. self = [super init];
  24. if (self) {
  25. [self commonInit];
  26. }
  27. return self;
  28. }
  29. #if SD_UIKIT
  30. - (void)commonInit {
  31. self.indicatorView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite];
  32. self.indicatorView.autoresizingMask = UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleBottomMargin;
  33. }
  34. #endif
  35. #if SD_MAC
  36. - (void)commonInit {
  37. self.indicatorView = [[NSProgressIndicator alloc] initWithFrame:NSZeroRect];
  38. self.indicatorView.style = NSProgressIndicatorStyleSpinning;
  39. self.indicatorView.controlSize = NSControlSizeSmall;
  40. [self.indicatorView sizeToFit];
  41. self.indicatorView.autoresizingMask = NSViewMaxXMargin | NSViewMinXMargin | NSViewMaxYMargin | NSViewMinYMargin;
  42. }
  43. #endif
  44. - (void)startAnimatingIndicator {
  45. #if SD_UIKIT
  46. [self.indicatorView startAnimating];
  47. #else
  48. [self.indicatorView startAnimation:nil];
  49. #endif
  50. self.indicatorView.hidden = NO;
  51. }
  52. - (void)stopAnimatingIndicator {
  53. #if SD_UIKIT
  54. [self.indicatorView stopAnimating];
  55. #else
  56. [self.indicatorView stopAnimation:nil];
  57. #endif
  58. self.indicatorView.hidden = YES;
  59. }
  60. @end
  61. @implementation SDWebImageActivityIndicator (Conveniences)
  62. + (SDWebImageActivityIndicator *)grayIndicator {
  63. SDWebImageActivityIndicator *indicator = [SDWebImageActivityIndicator new];
  64. #if SD_UIKIT
  65. #if SD_IOS
  66. indicator.indicatorView.activityIndicatorViewStyle = UIActivityIndicatorViewStyleGray;
  67. #else
  68. indicator.indicatorView.color = [UIColor colorWithWhite:0 alpha:0.45]; // Color from `UIActivityIndicatorViewStyleGray`
  69. #endif
  70. #endif
  71. return indicator;
  72. }
  73. + (SDWebImageActivityIndicator *)grayLargeIndicator {
  74. SDWebImageActivityIndicator *indicator = SDWebImageActivityIndicator.grayIndicator;
  75. #if SD_UIKIT
  76. UIColor *grayColor = indicator.indicatorView.color;
  77. indicator.indicatorView.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhiteLarge;
  78. indicator.indicatorView.color = grayColor;
  79. #else
  80. indicator.indicatorView.controlSize = NSControlSizeRegular;
  81. #endif
  82. [indicator.indicatorView sizeToFit];
  83. return indicator;
  84. }
  85. + (SDWebImageActivityIndicator *)whiteIndicator {
  86. SDWebImageActivityIndicator *indicator = [SDWebImageActivityIndicator new];
  87. #if SD_UIKIT
  88. indicator.indicatorView.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhite;
  89. #else
  90. CIFilter *lighten = [CIFilter filterWithName:@"CIColorControls"];
  91. [lighten setDefaults];
  92. [lighten setValue:@(1) forKey:kCIInputBrightnessKey];
  93. indicator.indicatorView.contentFilters = @[lighten];
  94. #endif
  95. return indicator;
  96. }
  97. + (SDWebImageActivityIndicator *)whiteLargeIndicator {
  98. SDWebImageActivityIndicator *indicator = SDWebImageActivityIndicator.whiteIndicator;
  99. #if SD_UIKIT
  100. indicator.indicatorView.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhiteLarge;
  101. #else
  102. indicator.indicatorView.controlSize = NSControlSizeRegular;
  103. [indicator.indicatorView sizeToFit];
  104. #endif
  105. return indicator;
  106. }
  107. @end
  108. #pragma mark - Progress Indicator
  109. @interface SDWebImageProgressIndicator ()
  110. #if SD_UIKIT
  111. @property (nonatomic, strong, readwrite, nonnull) UIProgressView *indicatorView;
  112. #else
  113. @property (nonatomic, strong, readwrite, nonnull) NSProgressIndicator *indicatorView;
  114. #endif
  115. @end
  116. @implementation SDWebImageProgressIndicator
  117. - (instancetype)init {
  118. self = [super init];
  119. if (self) {
  120. [self commonInit];
  121. }
  122. return self;
  123. }
  124. #if SD_UIKIT
  125. - (void)commonInit {
  126. self.indicatorView = [[UIProgressView alloc] initWithProgressViewStyle:UIProgressViewStyleDefault];
  127. self.indicatorView.autoresizingMask = UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleBottomMargin;
  128. }
  129. #endif
  130. #if SD_MAC
  131. - (void)commonInit {
  132. self.indicatorView = [[NSProgressIndicator alloc] initWithFrame:NSMakeRect(0, 0, 160, 0)]; // Width from `UIProgressView` default width
  133. self.indicatorView.style = NSProgressIndicatorStyleBar;
  134. self.indicatorView.controlSize = NSControlSizeSmall;
  135. [self.indicatorView sizeToFit];
  136. self.indicatorView.autoresizingMask = NSViewMaxXMargin | NSViewMinXMargin | NSViewMaxYMargin | NSViewMinYMargin;
  137. }
  138. #endif
  139. #pragma clang diagnostic push
  140. #pragma clang diagnostic ignored "-Wunguarded-availability"
  141. - (void)startAnimatingIndicator {
  142. self.indicatorView.hidden = NO;
  143. #if SD_UIKIT
  144. if ([self.indicatorView respondsToSelector:@selector(observedProgress)] && self.indicatorView.observedProgress) {
  145. // Ignore NSProgress
  146. } else {
  147. self.indicatorView.progress = 0;
  148. }
  149. #else
  150. self.indicatorView.indeterminate = YES;
  151. self.indicatorView.doubleValue = 0;
  152. [self.indicatorView startAnimation:nil];
  153. #endif
  154. }
  155. - (void)stopAnimatingIndicator {
  156. self.indicatorView.hidden = YES;
  157. #if SD_UIKIT
  158. if ([self.indicatorView respondsToSelector:@selector(observedProgress)] && self.indicatorView.observedProgress) {
  159. // Ignore NSProgress
  160. } else {
  161. self.indicatorView.progress = 1;
  162. }
  163. #else
  164. self.indicatorView.indeterminate = NO;
  165. self.indicatorView.doubleValue = 100;
  166. [self.indicatorView stopAnimation:nil];
  167. #endif
  168. }
  169. - (void)updateIndicatorProgress:(double)progress {
  170. #if SD_UIKIT
  171. if ([self.indicatorView respondsToSelector:@selector(observedProgress)] && self.indicatorView.observedProgress) {
  172. // Ignore NSProgress
  173. } else {
  174. [self.indicatorView setProgress:progress animated:YES];
  175. }
  176. #else
  177. self.indicatorView.indeterminate = progress > 0 ? NO : YES;
  178. self.indicatorView.doubleValue = progress * 100;
  179. #endif
  180. }
  181. #pragma clang diagnostic pop
  182. @end
  183. @implementation SDWebImageProgressIndicator (Conveniences)
  184. + (SDWebImageProgressIndicator *)defaultIndicator {
  185. SDWebImageProgressIndicator *indicator = [SDWebImageProgressIndicator new];
  186. return indicator;
  187. }
  188. #if SD_IOS
  189. + (SDWebImageProgressIndicator *)barIndicator {
  190. SDWebImageProgressIndicator *indicator = [SDWebImageProgressIndicator new];
  191. indicator.indicatorView.progressViewStyle = UIProgressViewStyleBar;
  192. return indicator;
  193. }
  194. #endif
  195. @end
  196. #endif