Merge pull request #2185 from dreampiggy/refactor_indicator

Refactor the image indicator usage for UIView category
This commit is contained in:
DreamPiggy 2018-02-04 15:55:17 +08:00 committed by GitHub
commit 7f2ba8cded
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 420 additions and 142 deletions

View File

@ -7,64 +7,25 @@
*/ */
#import "DetailViewController.h" #import "DetailViewController.h"
#import <SDWebImage/FLAnimatedImageView.h> #import <SDWebImage/UIView+WebCache.h>
#import <SDWebImage/FLAnimatedImageView+WebCache.h> #import <SDWebImage/FLAnimatedImageView+WebCache.h>
@interface DetailViewController () @interface DetailViewController ()
@property (strong, nonatomic) IBOutlet FLAnimatedImageView *imageView; @property (strong, nonatomic) IBOutlet FLAnimatedImageView *imageView;
@property (strong, nonatomic) UIActivityIndicatorView *activityIndicator;
@property (strong, nonatomic) UIProgressView *progressView;
@end @end
@implementation DetailViewController @implementation DetailViewController
- (UIActivityIndicatorView *)activityIndicator
{
if (!_activityIndicator) {
_activityIndicator = [UIActivityIndicatorView.alloc initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
_activityIndicator.center = self.imageView.center;
_activityIndicator.autoresizingMask = UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin;
[self.imageView addSubview:_activityIndicator];
}
return _activityIndicator;
}
- (UIProgressView *)progressView
{
if (!_progressView) {
_progressView = [[UIProgressView alloc] initWithProgressViewStyle:UIProgressViewStyleDefault];
[self.view addSubview:_progressView];
}
return _progressView;
}
- (void)configureView - (void)configureView
{ {
self.activityIndicator.hidden = NO; if (!self.imageView.sd_imageIndicator) {
[self.activityIndicator startAnimating]; self.imageView.sd_imageIndicator = SDWebImageProgressIndicator.defaultIndicator;
}
__weak typeof(self) weakSelf = self;
[self.imageView sd_setImageWithURL:self.imageURL [self.imageView sd_setImageWithURL:self.imageURL
placeholderImage:nil placeholderImage:nil
options:SDWebImageProgressiveDownload options:SDWebImageProgressiveDownload];
progress:^(NSInteger receivedSize, NSInteger expectedSize, NSURL *targetURL) {
dispatch_async(dispatch_get_main_queue(), ^{
float progress = 0;
if (expectedSize != 0) {
progress = (float)receivedSize / (float)expectedSize;
}
weakSelf.progressView.hidden = NO;
[weakSelf.progressView setProgress:progress animated:YES];
});
}
completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
weakSelf.progressView.hidden = YES;
[weakSelf.activityIndicator stopAnimating];
weakSelf.activityIndicator.hidden = YES;
}];
} }
- (void)viewDidLoad - (void)viewDidLoad
@ -73,12 +34,6 @@
[self configureView]; [self configureView];
} }
- (void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];
self.progressView.frame = CGRectMake(0, self.topLayoutGuide.length, CGRectGetWidth(self.view.bounds), 2.0);
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{ {
return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown); return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);

View File

@ -118,11 +118,9 @@
if (cell == nil) { if (cell == nil) {
cell = [[MyCustomTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; cell = [[MyCustomTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
cell.customImageView.sd_imageTransition = SDWebImageTransition.fadeTransition; cell.customImageView.sd_imageTransition = SDWebImageTransition.fadeTransition;
cell.customImageView.sd_imageIndicator = SDWebImageActivityIndicator.grayIndicator;
} }
[cell.customImageView sd_setShowActivityIndicatorView:YES];
[cell.customImageView sd_setIndicatorStyle:UIActivityIndicatorViewStyleGray];
cell.customTextLabel.text = [NSString stringWithFormat:@"Image #%ld", (long)indexPath.row]; cell.customTextLabel.text = [NSString stringWithFormat:@"Image #%ld", (long)indexPath.row];
[cell.customImageView sd_setImageWithURL:[NSURL URLWithString:self.objects[indexPath.row]] [cell.customImageView sd_setImageWithURL:[NSURL URLWithString:self.objects[indexPath.row]]
placeholderImage:placeholderImage placeholderImage:placeholderImage

View File

@ -31,6 +31,7 @@
// For animated GIF rendering, set `animates` to YES or will only show the first frame // For animated GIF rendering, set `animates` to YES or will only show the first frame
self.imageView1.animates = YES; self.imageView1.animates = YES;
self.imageView3.animates = YES; self.imageView3.animates = YES;
self.imageView1.sd_imageIndicator = SDWebImageProgressIndicator.defaultIndicator;
[self.imageView1 sd_setImageWithURL:[NSURL URLWithString:@"http://assets.sbnation.com/assets/2512203/dogflops.gif"]]; [self.imageView1 sd_setImageWithURL:[NSURL URLWithString:@"http://assets.sbnation.com/assets/2512203/dogflops.gif"]];
[self.imageView2 sd_setImageWithURL:[NSURL URLWithString:@"http://www.ioncannon.net/wp-content/uploads/2011/06/test2.webp"]]; [self.imageView2 sd_setImageWithURL:[NSURL URLWithString:@"http://www.ioncannon.net/wp-content/uploads/2011/06/test2.webp"]];
[self.imageView3 sd_setImageWithURL:[NSURL URLWithString:@"http://littlesvr.ca/apng/images/SteamEngine.webp"]]; [self.imageView3 sd_setImageWithURL:[NSURL URLWithString:@"http://littlesvr.ca/apng/images/SteamEngine.webp"]];

View File

@ -362,6 +362,18 @@
329A18621FFF5DFD008C9A2F /* UIImage+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 329A18581FFF5DFD008C9A2F /* UIImage+WebCache.m */; }; 329A18621FFF5DFD008C9A2F /* UIImage+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 329A18581FFF5DFD008C9A2F /* UIImage+WebCache.m */; };
329A18631FFF5DFD008C9A2F /* UIImage+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 329A18581FFF5DFD008C9A2F /* UIImage+WebCache.m */; }; 329A18631FFF5DFD008C9A2F /* UIImage+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 329A18581FFF5DFD008C9A2F /* UIImage+WebCache.m */; };
329A18641FFF5DFD008C9A2F /* UIImage+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 329A18581FFF5DFD008C9A2F /* UIImage+WebCache.m */; }; 329A18641FFF5DFD008C9A2F /* UIImage+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 329A18581FFF5DFD008C9A2F /* UIImage+WebCache.m */; };
32C0FDE12013426C001B8F2D /* SDWebImageIndicator.h in Headers */ = {isa = PBXBuildFile; fileRef = 32C0FDDF2013426C001B8F2D /* SDWebImageIndicator.h */; settings = {ATTRIBUTES = (Public, ); }; };
32C0FDE22013426C001B8F2D /* SDWebImageIndicator.h in Headers */ = {isa = PBXBuildFile; fileRef = 32C0FDDF2013426C001B8F2D /* SDWebImageIndicator.h */; settings = {ATTRIBUTES = (Public, ); }; };
32C0FDE32013426C001B8F2D /* SDWebImageIndicator.h in Headers */ = {isa = PBXBuildFile; fileRef = 32C0FDDF2013426C001B8F2D /* SDWebImageIndicator.h */; settings = {ATTRIBUTES = (Public, ); }; };
32C0FDE42013426C001B8F2D /* SDWebImageIndicator.h in Headers */ = {isa = PBXBuildFile; fileRef = 32C0FDDF2013426C001B8F2D /* SDWebImageIndicator.h */; settings = {ATTRIBUTES = (Public, ); }; };
32C0FDE52013426C001B8F2D /* SDWebImageIndicator.h in Headers */ = {isa = PBXBuildFile; fileRef = 32C0FDDF2013426C001B8F2D /* SDWebImageIndicator.h */; settings = {ATTRIBUTES = (Public, ); }; };
32C0FDE62013426C001B8F2D /* SDWebImageIndicator.h in Headers */ = {isa = PBXBuildFile; fileRef = 32C0FDDF2013426C001B8F2D /* SDWebImageIndicator.h */; settings = {ATTRIBUTES = (Public, ); }; };
32C0FDE72013426C001B8F2D /* SDWebImageIndicator.m in Sources */ = {isa = PBXBuildFile; fileRef = 32C0FDE02013426C001B8F2D /* SDWebImageIndicator.m */; };
32C0FDE82013426C001B8F2D /* SDWebImageIndicator.m in Sources */ = {isa = PBXBuildFile; fileRef = 32C0FDE02013426C001B8F2D /* SDWebImageIndicator.m */; };
32C0FDE92013426C001B8F2D /* SDWebImageIndicator.m in Sources */ = {isa = PBXBuildFile; fileRef = 32C0FDE02013426C001B8F2D /* SDWebImageIndicator.m */; };
32C0FDEA2013426C001B8F2D /* SDWebImageIndicator.m in Sources */ = {isa = PBXBuildFile; fileRef = 32C0FDE02013426C001B8F2D /* SDWebImageIndicator.m */; };
32C0FDEB2013426C001B8F2D /* SDWebImageIndicator.m in Sources */ = {isa = PBXBuildFile; fileRef = 32C0FDE02013426C001B8F2D /* SDWebImageIndicator.m */; };
32C0FDEC2013426C001B8F2D /* SDWebImageIndicator.m in Sources */ = {isa = PBXBuildFile; fileRef = 32C0FDE02013426C001B8F2D /* SDWebImageIndicator.m */; };
32CF1C071FA496B000004BD1 /* SDWebImageCoderHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = 32CF1C051FA496B000004BD1 /* SDWebImageCoderHelper.h */; settings = {ATTRIBUTES = (Public, ); }; }; 32CF1C071FA496B000004BD1 /* SDWebImageCoderHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = 32CF1C051FA496B000004BD1 /* SDWebImageCoderHelper.h */; settings = {ATTRIBUTES = (Public, ); }; };
32CF1C081FA496B000004BD1 /* SDWebImageCoderHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = 32CF1C051FA496B000004BD1 /* SDWebImageCoderHelper.h */; settings = {ATTRIBUTES = (Public, ); }; }; 32CF1C081FA496B000004BD1 /* SDWebImageCoderHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = 32CF1C051FA496B000004BD1 /* SDWebImageCoderHelper.h */; settings = {ATTRIBUTES = (Public, ); }; };
32CF1C091FA496B000004BD1 /* SDWebImageCoderHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = 32CF1C051FA496B000004BD1 /* SDWebImageCoderHelper.h */; settings = {ATTRIBUTES = (Public, ); }; }; 32CF1C091FA496B000004BD1 /* SDWebImageCoderHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = 32CF1C051FA496B000004BD1 /* SDWebImageCoderHelper.h */; settings = {ATTRIBUTES = (Public, ); }; };
@ -1371,6 +1383,8 @@
3290FA031FA478AF0047D20C /* SDWebImageFrame.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDWebImageFrame.m; sourceTree = "<group>"; }; 3290FA031FA478AF0047D20C /* SDWebImageFrame.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDWebImageFrame.m; sourceTree = "<group>"; };
329A18571FFF5DFD008C9A2F /* UIImage+WebCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "UIImage+WebCache.h"; path = "SDWebImage/UIImage+WebCache.h"; sourceTree = "<group>"; }; 329A18571FFF5DFD008C9A2F /* UIImage+WebCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "UIImage+WebCache.h"; path = "SDWebImage/UIImage+WebCache.h"; sourceTree = "<group>"; };
329A18581FFF5DFD008C9A2F /* UIImage+WebCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "UIImage+WebCache.m"; path = "SDWebImage/UIImage+WebCache.m"; sourceTree = "<group>"; }; 329A18581FFF5DFD008C9A2F /* UIImage+WebCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "UIImage+WebCache.m"; path = "SDWebImage/UIImage+WebCache.m"; sourceTree = "<group>"; };
32C0FDDF2013426C001B8F2D /* SDWebImageIndicator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDWebImageIndicator.h; sourceTree = "<group>"; };
32C0FDE02013426C001B8F2D /* SDWebImageIndicator.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDWebImageIndicator.m; sourceTree = "<group>"; };
32CF1C051FA496B000004BD1 /* SDWebImageCoderHelper.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDWebImageCoderHelper.h; sourceTree = "<group>"; }; 32CF1C051FA496B000004BD1 /* SDWebImageCoderHelper.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDWebImageCoderHelper.h; sourceTree = "<group>"; };
32CF1C061FA496B000004BD1 /* SDWebImageCoderHelper.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDWebImageCoderHelper.m; sourceTree = "<group>"; }; 32CF1C061FA496B000004BD1 /* SDWebImageCoderHelper.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SDWebImageCoderHelper.m; sourceTree = "<group>"; };
4314D1991D0E0E3B004B36C9 /* libSDWebImage watchOS static.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libSDWebImage watchOS static.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 4314D1991D0E0E3B004B36C9 /* libSDWebImage watchOS static.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libSDWebImage watchOS static.a"; sourceTree = BUILT_PRODUCTS_DIR; };
@ -1856,6 +1870,8 @@
324DF4B3200A14DC008A84CC /* SDWebImageDefine.m */, 324DF4B3200A14DC008A84CC /* SDWebImageDefine.m */,
325312C6200F09910046BF1E /* SDWebImageTransition.h */, 325312C6200F09910046BF1E /* SDWebImageTransition.h */,
325312C7200F09910046BF1E /* SDWebImageTransition.m */, 325312C7200F09910046BF1E /* SDWebImageTransition.m */,
32C0FDDF2013426C001B8F2D /* SDWebImageIndicator.h */,
32C0FDE02013426C001B8F2D /* SDWebImageIndicator.m */,
); );
name = Utils; name = Utils;
sourceTree = "<group>"; sourceTree = "<group>";
@ -2105,6 +2121,7 @@
323F8BF91F38EF770092B609 /* animi.h in Headers */, 323F8BF91F38EF770092B609 /* animi.h in Headers */,
80377C4F1F2F666300F89830 /* filters_utils.h in Headers */, 80377C4F1F2F666300F89830 /* filters_utils.h in Headers */,
80377C4C1F2F666300F89830 /* color_cache_utils.h in Headers */, 80377C4C1F2F666300F89830 /* color_cache_utils.h in Headers */,
32C0FDE42013426C001B8F2D /* SDWebImageIndicator.h in Headers */,
321E60C11F38E91700405457 /* UIImage+ForceDecode.h in Headers */, 321E60C11F38E91700405457 /* UIImage+ForceDecode.h in Headers */,
80377DBE1F2F66A700F89830 /* dsp.h in Headers */, 80377DBE1F2F66A700F89830 /* dsp.h in Headers */,
80377EB81F2F66D400F89830 /* alphai_dec.h in Headers */, 80377EB81F2F66D400F89830 /* alphai_dec.h in Headers */,
@ -2163,6 +2180,7 @@
80377C1B1F2F666300F89830 /* filters_utils.h in Headers */, 80377C1B1F2F666300F89830 /* filters_utils.h in Headers */,
323F8B6F1F38EF770092B609 /* delta_palettization_enc.h in Headers */, 323F8B6F1F38EF770092B609 /* delta_palettization_enc.h in Headers */,
4314D1781D0E0E3B004B36C9 /* SDWebImageDownloader.h in Headers */, 4314D1781D0E0E3B004B36C9 /* SDWebImageDownloader.h in Headers */,
32C0FDE22013426C001B8F2D /* SDWebImageIndicator.h in Headers */,
80377E981F2F66D400F89830 /* alphai_dec.h in Headers */, 80377E981F2F66D400F89830 /* alphai_dec.h in Headers */,
4314D1791D0E0E3B004B36C9 /* SDWebImageManager.h in Headers */, 4314D1791D0E0E3B004B36C9 /* SDWebImageManager.h in Headers */,
323F8BE51F38EF770092B609 /* vp8li_enc.h in Headers */, 323F8BE51F38EF770092B609 /* vp8li_enc.h in Headers */,
@ -2243,6 +2261,7 @@
80377C671F2F666400F89830 /* endian_inl_utils.h in Headers */, 80377C671F2F666400F89830 /* endian_inl_utils.h in Headers */,
80377C6B1F2F666400F89830 /* huffman_encode_utils.h in Headers */, 80377C6B1F2F666400F89830 /* huffman_encode_utils.h in Headers */,
323F8C121F38EF770092B609 /* muxi.h in Headers */, 323F8C121F38EF770092B609 /* muxi.h in Headers */,
32C0FDE52013426C001B8F2D /* SDWebImageIndicator.h in Headers */,
80377ED61F2F66D500F89830 /* webpi_dec.h in Headers */, 80377ED61F2F66D500F89830 /* webpi_dec.h in Headers */,
323F8BE81F38EF770092B609 /* vp8li_enc.h in Headers */, 323F8BE81F38EF770092B609 /* vp8li_enc.h in Headers */,
323F8B8A1F38EF770092B609 /* histogram_enc.h in Headers */, 323F8B8A1F38EF770092B609 /* histogram_enc.h in Headers */,
@ -2326,6 +2345,7 @@
80377E3A1F2F66A800F89830 /* common_sse2.h in Headers */, 80377E3A1F2F66A800F89830 /* common_sse2.h in Headers */,
4397D2D91D0DDD8C00BB2784 /* SDWebImagePrefetcher.h in Headers */, 4397D2D91D0DDD8C00BB2784 /* SDWebImagePrefetcher.h in Headers */,
80377C871F2F666400F89830 /* huffman_utils.h in Headers */, 80377C871F2F666400F89830 /* huffman_utils.h in Headers */,
32C0FDE62013426C001B8F2D /* SDWebImageIndicator.h in Headers */,
4397D2DA1D0DDD8C00BB2784 /* UIView+WebCacheOperation.h in Headers */, 4397D2DA1D0DDD8C00BB2784 /* UIView+WebCacheOperation.h in Headers */,
80377E661F2F66A800F89830 /* neon.h in Headers */, 80377E661F2F66A800F89830 /* neon.h in Headers */,
4397D2DB1D0DDD8C00BB2784 /* UIImage+MultiFormat.h in Headers */, 4397D2DB1D0DDD8C00BB2784 /* UIImage+MultiFormat.h in Headers */,
@ -2427,6 +2447,7 @@
80377C351F2F666300F89830 /* filters_utils.h in Headers */, 80377C351F2F666300F89830 /* filters_utils.h in Headers */,
80377C321F2F666300F89830 /* color_cache_utils.h in Headers */, 80377C321F2F666300F89830 /* color_cache_utils.h in Headers */,
321E60C01F38E91700405457 /* UIImage+ForceDecode.h in Headers */, 321E60C01F38E91700405457 /* UIImage+ForceDecode.h in Headers */,
32C0FDE32013426C001B8F2D /* SDWebImageIndicator.h in Headers */,
80377D791F2F66A700F89830 /* dsp.h in Headers */, 80377D791F2F66A700F89830 /* dsp.h in Headers */,
80377EA81F2F66D400F89830 /* alphai_dec.h in Headers */, 80377EA81F2F66D400F89830 /* alphai_dec.h in Headers */,
4A2CAE2D1AB4BB7500B6BC39 /* UIImage+GIF.h in Headers */, 4A2CAE2D1AB4BB7500B6BC39 /* UIImage+GIF.h in Headers */,
@ -2449,6 +2470,7 @@
53761316155AD0D5005750A4 /* SDImageCache.h in Headers */, 53761316155AD0D5005750A4 /* SDImageCache.h in Headers */,
323F8C0E1F38EF770092B609 /* muxi.h in Headers */, 323F8C0E1F38EF770092B609 /* muxi.h in Headers */,
325312C8200F09910046BF1E /* SDWebImageTransition.h in Headers */, 325312C8200F09910046BF1E /* SDWebImageTransition.h in Headers */,
32C0FDE12013426C001B8F2D /* SDWebImageIndicator.h in Headers */,
321E60A21F38E8F600405457 /* SDWebImageGIFCoder.h in Headers */, 321E60A21F38E8F600405457 /* SDWebImageGIFCoder.h in Headers */,
5D5B9142188EE8DD006D06BD /* NSData+ImageContentType.h in Headers */, 5D5B9142188EE8DD006D06BD /* NSData+ImageContentType.h in Headers */,
80377BFE1F2F665300F89830 /* color_cache_utils.h in Headers */, 80377BFE1F2F665300F89830 /* color_cache_utils.h in Headers */,
@ -2779,6 +2801,7 @@
321E60B91F38E90100405457 /* SDWebImageWebPCoder.m in Sources */, 321E60B91F38E90100405457 /* SDWebImageWebPCoder.m in Sources */,
80377DEB1F2F66A700F89830 /* yuv.c in Sources */, 80377DEB1F2F66A700F89830 /* yuv.c in Sources */,
3237F9E920161AE000A88143 /* NSImage+Additions.m in Sources */, 3237F9E920161AE000A88143 /* NSImage+Additions.m in Sources */,
32C0FDEA2013426C001B8F2D /* SDWebImageIndicator.m in Sources */,
00733A551BC4880000A5A117 /* SDWebImageDownloader.m in Sources */, 00733A551BC4880000A5A117 /* SDWebImageDownloader.m in Sources */,
80377EB71F2F66D400F89830 /* alpha_dec.c in Sources */, 80377EB71F2F66D400F89830 /* alpha_dec.c in Sources */,
80377DC61F2F66A700F89830 /* enc.c in Sources */, 80377DC61F2F66A700F89830 /* enc.c in Sources */,
@ -2980,6 +3003,7 @@
323F8BA91F38EF770092B609 /* picture_psnr_enc.c in Sources */, 323F8BA91F38EF770092B609 /* picture_psnr_enc.c in Sources */,
323F8C091F38EF770092B609 /* muxedit.c in Sources */, 323F8C091F38EF770092B609 /* muxedit.c in Sources */,
80377D1F1F2F66A700F89830 /* alpha_processing_neon.c in Sources */, 80377D1F1F2F66A700F89830 /* alpha_processing_neon.c in Sources */,
32C0FDE82013426C001B8F2D /* SDWebImageIndicator.m in Sources */,
4314D1401D0E0E3B004B36C9 /* UIImageView+WebCache.m in Sources */, 4314D1401D0E0E3B004B36C9 /* UIImageView+WebCache.m in Sources */,
43A9186C1D8308FE00B3925F /* SDImageCacheConfig.m in Sources */, 43A9186C1D8308FE00B3925F /* SDImageCacheConfig.m in Sources */,
3237F9EC20161AE000A88143 /* NSImage+Additions.m in Sources */, 3237F9EC20161AE000A88143 /* NSImage+Additions.m in Sources */,
@ -3127,6 +3151,7 @@
80377C611F2F666400F89830 /* bit_reader_utils.c in Sources */, 80377C611F2F666400F89830 /* bit_reader_utils.c in Sources */,
323F8BAC1F38EF770092B609 /* picture_psnr_enc.c in Sources */, 323F8BAC1F38EF770092B609 /* picture_psnr_enc.c in Sources */,
323F8C0C1F38EF770092B609 /* muxedit.c in Sources */, 323F8C0C1F38EF770092B609 /* muxedit.c in Sources */,
32C0FDEB2013426C001B8F2D /* SDWebImageIndicator.m in Sources */,
80377DEE1F2F66A800F89830 /* alpha_processing_neon.c in Sources */, 80377DEE1F2F66A800F89830 /* alpha_processing_neon.c in Sources */,
43C892A41D9D6DDD0022038D /* demux.c in Sources */, 43C892A41D9D6DDD0022038D /* demux.c in Sources */,
3237F9EA20161AE000A88143 /* NSImage+Additions.m in Sources */, 3237F9EA20161AE000A88143 /* NSImage+Additions.m in Sources */,
@ -3312,6 +3337,7 @@
4369C2831D9807EC007E863A /* UIView+WebCache.m in Sources */, 4369C2831D9807EC007E863A /* UIView+WebCache.m in Sources */,
80377E611F2F66A800F89830 /* lossless_sse2.c in Sources */, 80377E611F2F66A800F89830 /* lossless_sse2.c in Sources */,
80377E691F2F66A800F89830 /* rescaler_msa.c in Sources */, 80377E691F2F66A800F89830 /* rescaler_msa.c in Sources */,
32C0FDEC2013426C001B8F2D /* SDWebImageIndicator.m in Sources */,
80377E5E1F2F66A800F89830 /* lossless_mips_dsp_r2.c in Sources */, 80377E5E1F2F66A800F89830 /* lossless_mips_dsp_r2.c in Sources */,
80377E3D1F2F66A800F89830 /* cost_sse2.c in Sources */, 80377E3D1F2F66A800F89830 /* cost_sse2.c in Sources */,
321E60BB1F38E90100405457 /* SDWebImageWebPCoder.m in Sources */, 321E60BB1F38E90100405457 /* SDWebImageWebPCoder.m in Sources */,
@ -3373,6 +3399,7 @@
321E60B81F38E90100405457 /* SDWebImageWebPCoder.m in Sources */, 321E60B81F38E90100405457 /* SDWebImageWebPCoder.m in Sources */,
43CE757A1CFE9427006C64D0 /* FLAnimatedImage.m in Sources */, 43CE757A1CFE9427006C64D0 /* FLAnimatedImage.m in Sources */,
3237F9E820161AE000A88143 /* NSImage+Additions.m in Sources */, 3237F9E820161AE000A88143 /* NSImage+Additions.m in Sources */,
32C0FDE92013426C001B8F2D /* SDWebImageIndicator.m in Sources */,
80377D811F2F66A700F89830 /* enc.c in Sources */, 80377D811F2F66A700F89830 /* enc.c in Sources */,
80377EA71F2F66D400F89830 /* alpha_dec.c in Sources */, 80377EA71F2F66D400F89830 /* alpha_dec.c in Sources */,
80377D8F1F2F66A700F89830 /* lossless_mips_dsp_r2.c in Sources */, 80377D8F1F2F66A700F89830 /* lossless_mips_dsp_r2.c in Sources */,
@ -3524,6 +3551,7 @@
43CE75791CFE9427006C64D0 /* FLAnimatedImage.m in Sources */, 43CE75791CFE9427006C64D0 /* FLAnimatedImage.m in Sources */,
80377CF71F2F66A100F89830 /* enc.c in Sources */, 80377CF71F2F66A100F89830 /* enc.c in Sources */,
3237F9EB20161AE000A88143 /* NSImage+Additions.m in Sources */, 3237F9EB20161AE000A88143 /* NSImage+Additions.m in Sources */,
32C0FDE72013426C001B8F2D /* SDWebImageIndicator.m in Sources */,
80377E871F2F66D000F89830 /* alpha_dec.c in Sources */, 80377E871F2F66D000F89830 /* alpha_dec.c in Sources */,
80377D051F2F66A100F89830 /* lossless_mips_dsp_r2.c in Sources */, 80377D051F2F66A100F89830 /* lossless_mips_dsp_r2.c in Sources */,
80377C0A1F2F665300F89830 /* random_utils.c in Sources */, 80377C0A1F2F665300F89830 /* random_utils.c in Sources */,

View File

@ -0,0 +1,97 @@
/*
* 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 "SDWebImageCompat.h"
#if SD_UIKIT || SD_MAC
// A protocol to custom the indicator during the image loading
// All of these methods are called from main queue
@protocol SDWebImageIndicator <NSObject>
@required
/**
The view associate to the indicator.
@return The indicator view
*/
- (nonnull UIView *)indicatorView;
/**
Start the animating for indicator.
*/
- (void)startAnimatingIndicator;
/**
Stop the animating for indicator.
*/
- (void)stopAnimatingIndicator;
@optional
/**
Update the loading progress (0-1.0) for indicator. Optional
@param progress The progress, value between 0 and 1.0
*/
- (void)updateIndicatorProgress:(double)progress;
@end
#pragma mark - Activity Indicator
// Activity indicator class
// for UIKit(macOS), it use a `UIActivityIndicatorView`
// for AppKit(macOS), it use a `NSProgressIndicator` with the spinning style
@interface SDWebImageActivityIndicator : NSObject <SDWebImageIndicator>
#if SD_UIKIT
@property (nonatomic, strong, readonly, nonnull) UIActivityIndicatorView *indicatorView;
#else
@property (nonatomic, strong, readonly, nonnull) NSProgressIndicator *indicatorView;
#endif
@end
// Convenience way to use activity indicator.
@interface SDWebImageActivityIndicator (Conveniences)
/// gray-style activity indicator
@property (nonatomic, class, nonnull, readonly) SDWebImageActivityIndicator *grayIndicator API_UNAVAILABLE(tvos);
/// large gray-style activity indicator
@property (nonatomic, class, nonnull, readonly) SDWebImageActivityIndicator *grayLargeIndicator API_UNAVAILABLE(ios, tvos);
/// white-style activity indicator
@property (nonatomic, class, nonnull, readonly) SDWebImageActivityIndicator *whiteIndicator;
/// large white-style activity indicator
@property (nonatomic, class, nonnull, readonly) SDWebImageActivityIndicator *whiteLargeIndicator;
@end
#pragma mark - Progress Indicator
// Progress indicator class
// for UIKit(macOS), it use a `UIProgressView`
// for AppKit(macOS), it use a `NSProgressIndicator` with the bar style
@interface SDWebImageProgressIndicator : NSObject <SDWebImageIndicator>
#if SD_UIKIT
@property (nonatomic, strong, readonly, nonnull) UIProgressView *indicatorView;
#else
@property (nonatomic, strong, readonly, nonnull) NSProgressIndicator *indicatorView;
#endif
@end
// Convenience way to create progress indicator. Remember to specify the indicator width or use layout constraint if need.
@interface SDWebImageProgressIndicator (Conveniences)
/// default-style progress indicator
@property (nonatomic, class, nonnull, readonly) SDWebImageProgressIndicator *defaultIndicator;
/// bar-style progress indicator
@property (nonatomic, class, nonnull, readonly) SDWebImageProgressIndicator *barIndicator API_UNAVAILABLE(macos, tvos);
@end
#endif

View File

@ -0,0 +1,226 @@
/*
* 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 {
#if SD_TV
UIActivityIndicatorViewStyle style = UIActivityIndicatorViewStyleWhite;
#else
UIActivityIndicatorViewStyle style = UIActivityIndicatorViewStyleGray;
#endif
self.indicatorView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:style];
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)
#if SD_MAC || SD_IOS
+ (SDWebImageActivityIndicator *)grayIndicator {
SDWebImageActivityIndicator *indicator = [SDWebImageActivityIndicator new];
return indicator;
}
#endif
#if SD_MAC
+ (SDWebImageActivityIndicator *)grayLargeIndicator {
SDWebImageActivityIndicator *indicator = SDWebImageActivityIndicator.grayIndicator;
indicator.indicatorView.controlSize = NSControlSizeRegular;
[indicator.indicatorView sizeToFit];
return indicator;
}
#endif
+ (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)];
self.indicatorView.style = NSProgressIndicatorStyleBar;
self.indicatorView.controlSize = NSControlSizeSmall;
[self.indicatorView sizeToFit];
self.indicatorView.autoresizingMask = NSViewMaxXMargin | NSViewMinXMargin | NSViewMaxYMargin | NSViewMinYMargin;
}
#endif
- (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 = 1;
[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
}
@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

View File

@ -13,6 +13,7 @@
#import "SDWebImageDefine.h" #import "SDWebImageDefine.h"
#import "SDWebImageManager.h" #import "SDWebImageManager.h"
#import "SDWebImageTransition.h" #import "SDWebImageTransition.h"
#import "SDWebImageIndicator.h"
/** /**
The value specify that the image progress unit count cannot be determined because the progressBlock is not been called. The value specify that the image progress unit count cannot be determined because the progressBlock is not been called.
@ -106,27 +107,14 @@ typedef void(^SDSetImageBlock)(UIImage * _Nullable image, NSData * _Nullable ima
*/ */
@property (nonatomic, strong, nullable) SDWebImageTransition *sd_imageTransition; @property (nonatomic, strong, nullable) SDWebImageTransition *sd_imageTransition;
#if SD_UIKIT #pragma mark - Image Indicator
#pragma mark - Activity indicator
/** /**
* Show activity UIActivityIndicatorView The image indicator during the image loading. If you do not need indicator, specify nil. Defaults to nil
The setter will remove the old indicator view and add new indicator view to current view's subview.
@note Because this is UI related, you should access only from the main queue.
*/ */
- (void)sd_setShowActivityIndicatorView:(BOOL)show; @property (nonatomic, strong, nullable) id<SDWebImageIndicator> sd_imageIndicator;
/**
* set desired UIActivityIndicatorViewStyle
*
* @param style The style of the UIActivityIndicatorView
*/
- (void)sd_setIndicatorStyle:(UIActivityIndicatorViewStyle)style;
- (BOOL)sd_showActivityIndicatorView;
- (void)sd_addActivityIndicator;
- (void)sd_removeActivityIndicator;
#endif
@end @end

View File

@ -17,12 +17,6 @@ const int64_t SDWebImageProgressUnitCountUnknown = 1LL;
static char imageURLKey; static char imageURLKey;
#if SD_UIKIT
static char TAG_ACTIVITY_INDICATOR;
static char TAG_ACTIVITY_STYLE;
#endif
static char TAG_ACTIVITY_SHOW;
@implementation UIView (WebCache) @implementation UIView (WebCache)
- (nullable NSURL *)sd_imageURL { - (nullable NSURL *)sd_imageURL {
@ -79,15 +73,13 @@ static char TAG_ACTIVITY_SHOW;
} }
if (url) { if (url) {
// check if activityView is enabled or not
if ([self sd_showActivityIndicatorView]) {
[self sd_addActivityIndicator];
}
// reset the progress // reset the progress
self.sd_imageProgress.totalUnitCount = 0; self.sd_imageProgress.totalUnitCount = 0;
self.sd_imageProgress.completedUnitCount = 0; self.sd_imageProgress.completedUnitCount = 0;
// check and start image indicator
[self sd_startImageIndicator];
SDWebImageManager *manager; SDWebImageManager *manager;
if ([context valueForKey:SDWebImageContextCustomManager]) { if ([context valueForKey:SDWebImageContextCustomManager]) {
manager = (SDWebImageManager *)[context valueForKey:SDWebImageContextCustomManager]; manager = (SDWebImageManager *)[context valueForKey:SDWebImageContextCustomManager];
@ -95,6 +87,8 @@ static char TAG_ACTIVITY_SHOW;
manager = [SDWebImageManager sharedManager]; manager = [SDWebImageManager sharedManager];
} }
id<SDWebImageIndicator> imageIndicator = self.sd_imageIndicator;
__weak __typeof(self)wself = self; __weak __typeof(self)wself = self;
SDWebImageDownloaderProgressBlock combinedProgressBlock = ^(NSInteger receivedSize, NSInteger expectedSize, NSURL * _Nullable targetURL) { SDWebImageDownloaderProgressBlock combinedProgressBlock = ^(NSInteger receivedSize, NSInteger expectedSize, NSURL * _Nullable targetURL) {
wself.sd_imageProgress.totalUnitCount = expectedSize; wself.sd_imageProgress.totalUnitCount = expectedSize;
@ -102,16 +96,27 @@ static char TAG_ACTIVITY_SHOW;
if (progressBlock) { if (progressBlock) {
progressBlock(receivedSize, expectedSize, targetURL); progressBlock(receivedSize, expectedSize, targetURL);
} }
if ([imageIndicator respondsToSelector:@selector(updateIndicatorProgress:)]) {
double progress = wself.sd_imageProgress.fractionCompleted;
dispatch_async(dispatch_get_main_queue(), ^{
[imageIndicator updateIndicatorProgress:progress];
});
}
}; };
id <SDWebImageOperation> operation = [manager loadImageWithURL:url options:options progress:combinedProgressBlock completed:^(UIImage *image, NSData *data, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { id <SDWebImageOperation> operation = [manager loadImageWithURL:url options:options progress:combinedProgressBlock completed:^(UIImage *image, NSData *data, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {
__strong __typeof (wself) sself = wself; __strong __typeof (wself) sself = wself;
if (!sself) { return; } if (!sself) { return; }
[sself sd_removeActivityIndicator];
// if the progress not been updated, mark it to complete state // if the progress not been updated, mark it to complete state
if (finished && !error && sself.sd_imageProgress.totalUnitCount == 0 && sself.sd_imageProgress.completedUnitCount == 0) { if (finished && !error && sself.sd_imageProgress.totalUnitCount == 0 && sself.sd_imageProgress.completedUnitCount == 0) {
sself.sd_imageProgress.totalUnitCount = SDWebImageProgressUnitCountUnknown; sself.sd_imageProgress.totalUnitCount = SDWebImageProgressUnitCountUnknown;
sself.sd_imageProgress.completedUnitCount = SDWebImageProgressUnitCountUnknown; sself.sd_imageProgress.completedUnitCount = SDWebImageProgressUnitCountUnknown;
} }
// check and stop image indicator
if (finished) {
[self sd_stopImageIndicator];
}
BOOL shouldCallCompletedBlock = finished || (options & SDWebImageAvoidAutoSetImage); BOOL shouldCallCompletedBlock = finished || (options & SDWebImageAvoidAutoSetImage);
BOOL shouldNotSetImage = ((image && (options & SDWebImageAvoidAutoSetImage)) || BOOL shouldNotSetImage = ((image && (options & SDWebImageAvoidAutoSetImage)) ||
(!image && !(options & SDWebImageDelayPlaceholder))); (!image && !(options & SDWebImageDelayPlaceholder)));
@ -170,8 +175,8 @@ static char TAG_ACTIVITY_SHOW;
} context:context]; } context:context];
[self sd_setImageLoadOperation:operation forKey:validOperationKey]; [self sd_setImageLoadOperation:operation forKey:validOperationKey];
} else { } else {
[self sd_stopImageIndicator];
dispatch_main_async_safe(^{ dispatch_main_async_safe(^{
[self sd_removeActivityIndicator];
if (completedBlock) { if (completedBlock) {
NSError *error = [NSError errorWithDomain:SDWebImageErrorDomain code:-1 userInfo:@{NSLocalizedDescriptionKey : @"Trying to load a nil url"}]; NSError *error = [NSError errorWithDomain:SDWebImageErrorDomain code:-1 userInfo:@{NSLocalizedDescriptionKey : @"Trying to load a nil url"}];
completedBlock(nil, error, SDImageCacheTypeNone, url); completedBlock(nil, error, SDImageCacheTypeNone, url);
@ -277,75 +282,54 @@ static char TAG_ACTIVITY_SHOW;
objc_setAssociatedObject(self, @selector(sd_imageTransition), sd_imageTransition, OBJC_ASSOCIATION_RETAIN_NONATOMIC); objc_setAssociatedObject(self, @selector(sd_imageTransition), sd_imageTransition, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
} }
#pragma mark - Activity indicator #pragma mark - Indicator
- (id<SDWebImageIndicator>)sd_imageIndicator {
#pragma mark - return objc_getAssociatedObject(self, @selector(sd_imageIndicator));
#if SD_UIKIT
- (UIActivityIndicatorView *)activityIndicator {
return (UIActivityIndicatorView *)objc_getAssociatedObject(self, &TAG_ACTIVITY_INDICATOR);
} }
- (void)setActivityIndicator:(UIActivityIndicatorView *)activityIndicator { - (void)setSd_imageIndicator:(id<SDWebImageIndicator>)sd_imageIndicator {
objc_setAssociatedObject(self, &TAG_ACTIVITY_INDICATOR, activityIndicator, OBJC_ASSOCIATION_RETAIN); id<SDWebImageIndicator> previousIndicator = self.sd_imageIndicator;
} if (previousIndicator == sd_imageIndicator) {
[previousIndicator.indicatorView removeFromSuperview];
}
// Add the new indicator view
UIView *view = sd_imageIndicator.indicatorView;
if (CGRectEqualToRect(view.frame, CGRectZero)) {
view.frame = self.frame;
}
// Center the indicator view
#if SD_MAC
CGPoint center = CGPointMake(NSMidX(self.bounds), NSMidY(self.bounds));
NSRect frame = view.frame;
view.frame = NSMakeRect(center.x - NSMidX(frame), center.y - NSMidY(frame), NSWidth(frame), NSHeight(frame));
#else
view.center = CGPointMake(CGRectGetMidX(self.bounds), CGRectGetMidY(self.bounds));
#endif #endif
view.hidden = NO;
[self addSubview:view];
- (void)sd_setShowActivityIndicatorView:(BOOL)show { objc_setAssociatedObject(self, @selector(sd_imageIndicator), sd_imageIndicator, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
objc_setAssociatedObject(self, &TAG_ACTIVITY_SHOW, @(show), OBJC_ASSOCIATION_RETAIN);
} }
- (BOOL)sd_showActivityIndicatorView { - (void)sd_startImageIndicator {
return [objc_getAssociatedObject(self, &TAG_ACTIVITY_SHOW) boolValue]; id<SDWebImageIndicator> imageIndicator = self.sd_imageIndicator;
} if (!imageIndicator) {
return;
#if SD_UIKIT }
- (void)sd_setIndicatorStyle:(UIActivityIndicatorViewStyle)style{
objc_setAssociatedObject(self, &TAG_ACTIVITY_STYLE, [NSNumber numberWithInt:style], OBJC_ASSOCIATION_RETAIN);
}
- (int)sd_getIndicatorStyle{
return [objc_getAssociatedObject(self, &TAG_ACTIVITY_STYLE) intValue];
}
#endif
- (void)sd_addActivityIndicator {
#if SD_UIKIT
dispatch_main_async_safe(^{ dispatch_main_async_safe(^{
if (!self.activityIndicator) { [imageIndicator startAnimatingIndicator];
self.activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:[self sd_getIndicatorStyle]];
self.activityIndicator.translatesAutoresizingMaskIntoConstraints = NO;
[self addSubview:self.activityIndicator];
[self addConstraint:[NSLayoutConstraint constraintWithItem:self.activityIndicator
attribute:NSLayoutAttributeCenterX
relatedBy:NSLayoutRelationEqual
toItem:self
attribute:NSLayoutAttributeCenterX
multiplier:1.0
constant:0.0]];
[self addConstraint:[NSLayoutConstraint constraintWithItem:self.activityIndicator
attribute:NSLayoutAttributeCenterY
relatedBy:NSLayoutRelationEqual
toItem:self
attribute:NSLayoutAttributeCenterY
multiplier:1.0
constant:0.0]];
}
[self.activityIndicator startAnimating];
}); });
#endif
} }
- (void)sd_removeActivityIndicator { - (void)sd_stopImageIndicator {
#if SD_UIKIT id<SDWebImageIndicator> imageIndicator = self.sd_imageIndicator;
if (!imageIndicator) {
return;
}
dispatch_main_async_safe(^{ dispatch_main_async_safe(^{
if (self.activityIndicator) { [imageIndicator stopAnimatingIndicator];
[self.activityIndicator removeFromSuperview];
self.activityIndicator = nil;
}
}); });
#endif
} }
@end @end

View File

@ -36,6 +36,7 @@ FOUNDATION_EXPORT const unsigned char WebImageVersionString[];
#import <SDWebImage/SDWebImageOperation.h> #import <SDWebImage/SDWebImageOperation.h>
#import <SDWebImage/SDWebImageDownloader.h> #import <SDWebImage/SDWebImageDownloader.h>
#import <SDWebImage/SDWebImageTransition.h> #import <SDWebImage/SDWebImageTransition.h>
#import <SDWebImage/SDWebImageIndicator.h>
#if SD_MAC || SD_UIKIT #if SD_MAC || SD_UIKIT
#import <SDWebImage/MKAnnotationView+WebCache.h> #import <SDWebImage/MKAnnotationView+WebCache.h>