在SDWebImage中显示活动指示器

Phi*_*lip 31 objective-c uiactivityindicatorview sdwebimage

我正在使用SDWebView图像,我想显示一个活动指示器作为占位符,同时从远程获取图像.

我在这里尝试了Malek的答案如何在SDWebImage中显示活动指示器,但似乎如此

UIImage *cachedImage = [manager imageWithURL:url];
Run Code Online (Sandbox Code Playgroud)

已弃用.

是否有人使用此库可以告诉我如何在加载图像时插入活动指示器?

编辑

根据Michael Frederick的指示,我最终得到了这段代码,一切正常.

UIActivityIndicatorView *activityIndicator = [[[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite] autorelease];
activityIndicator.hidesWhenStopped = YES;
activityIndicator.hidden = NO;
[activityIndicator startAnimating];
activityIndicator.center = CGPointMake(self.tipImage.frame.size.width /2, self.tipImage.frame.size.height/2);
[imageView setImageWithURL:[NSURL URLWithString:imageString]
          placeholderImage:nil options:SDWebImageProgressiveDownload
                   success:^(UIImage *image) { [activityIndicator stopAnimating];[activityIndicator removeFromSuperview]; }
                   failure:^(NSError *error) {  [activityIndicator stopAnimating];[activityIndicator removeFromSuperview]; }];

[imageView addSubview:activityIndicator];
Run Code Online (Sandbox Code Playgroud)

Mic*_*ick 47

此fork支持此功能.看看差异.

但是,一般来说,你可以在不使用该分支的情况下轻松地完成它:

__block UIActivityIndicatorView *activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:activityStyle];
activityIndicator.center = imageView.center;
activityIndicator.hidesWhenStopped = YES;
[imageView setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"]
               placeholderImage:[UIImage imageNamed:@"placeholder.png"]
                        success:^(UIImage *image) { [activityIndicator removeFromSuperview]; }
                        failure:^(NSError *error) { [activityIndicator removeFromSuperview]; }];

[imageView addSubview:activityIndicator];
[activityIndicator startAnimating];
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是它不起作用.它加载占位符等但不加载activityIndi​​cator (3认同)

Zal*_*ldy 22

这是你如何做到的:

[imageView setIndicatorStyle:UIActivityIndicatorViewStyleWhite];
[imageView setShowActivityIndicatorView:true];
[imageView sd_setImageWithURL:[NSURL URLWithString:imageUrl] placeholderImage:[UIImage imageNamed:@"defaultl_image"]];
Run Code Online (Sandbox Code Playgroud)


Can*_*rek 17

那是我的解决方案.在该文件中:UIImageView + WebCache.m

找到那个方法并改变:

- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder
{
    UIActivityIndicatorView *activity = [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:(UIActivityIndicatorViewStyleGray)];
    [activity startAnimating];
    [activity setFrame:CGRectMake(self.frame.origin.x - 20, self.frame.origin.y - 10, self.frame.size.width, self.frame.size.height)];
    [self addSubview:activity];

    //[self setImageWithURL:url placeholderImage:placeholder options:0 progress:nil completed:nil];

    [self setImageWithURL:url
         placeholderImage:placeholder
                  options:0
                completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType)
     {
             [activity removeFromSuperview];
     }];
}
Run Code Online (Sandbox Code Playgroud)


E-R*_*die 15

最后解决方案

您可以下载UIActivityIndi​​cator-for-SDWebImage,这是向您的SDWebImage视图添加UIActivityView的最简单方法.使用CocoaPods,只需将此行添加到podfile:

pod 'UIActivityIndicator-for-SDWebImage'
Run Code Online (Sandbox Code Playgroud)

您可以根据自己的喜好使用以下其中一行:

- (void)setImageWithURL:(NSURL *)url usingActivityIndicatorStyle:(UIActivityIndicatorViewStyle)activityStyle;
- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder usingActivityIndicatorStyle:(UIActivityIndicatorViewStyle)activityStyle;
- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options usingActivityIndicatorStyle:(UIActivityIndicatorViewStyle)activityStyle;
- (void)setImageWithURL:(NSURL *)url completed:(SDWebImageCompletionBlock)completedBlock usingActivityIndicatorStyle:(UIActivityIndicatorViewStyle)activityStyle;
- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletionBlock)completedBlock usingActivityIndicatorStyle:(UIActivityIndicatorViewStyle)activityStyle;
- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDWebImageCompletionBlock)completedBlock usingActivityIndicatorStyle:(UIActivityIndicatorViewStyle)activityStyle;
- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionBlock)completedBlock usingActivityIndicatorStyle:(UIActivityIndicatorViewStyle)activityStyle;
Run Code Online (Sandbox Code Playgroud)

使用示例

只需导入

#import <UIActivityIndicator-for-SDWebImage/UIImageView+UIActivityIndicatorForSDWebImage.h>
Run Code Online (Sandbox Code Playgroud)

并使用此代码

[imageView setImageWithURL:[NSURL URLWithString:@"https://media.licdn.com/mpr/mpr/wc_200_200/p/1/005/07f/0a3/30cb8dd.jpg"] placeholderImage:[UIImage imageNamed:@"myImage.jpg"] usingActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
Run Code Online (Sandbox Code Playgroud)

  • 确实!回到那一天,没有这个解决方案.但+1为更新的解决方案! (2认同)

Ank*_*pta 7

SDWebImage 有一个完美的内置活动指示器。尝试这个:

更新:SWIFT 5 SDWebImage 5.xx

        imgView.sd_imageIndicator = SDWebImageActivityIndicator.gray
        imgView.sd_setImage(with: url, placeholderImage: UIImage(named: "placeholder"))
Run Code Online (Sandbox Code Playgroud)

斯威夫特 3:

imgView.setShowActivityIndicator(true)
imgView.setIndicatorStyle(.gray)
imgView.sd_setImage(with: URL(string: urlString), placeholderImage: UIImage(named: "placeholder"))
Run Code Online (Sandbox Code Playgroud)


Mic*_*ico 6

对于 Swift 5.0 和 SDWebImage 5.0 :

代替

imageView.sd_setShowActivityIndicatorView(true)
imageView.sd_setIndicatorStyle(.gray)
Run Code Online (Sandbox Code Playgroud)

经过

imageView.sd_imageIndicator = SDWebImageActivityIndicator.gray
Run Code Online (Sandbox Code Playgroud)


Jim*_*med 5

上面的代码有点不对.行'activityIndi​​cator.center = imageView.center'没有为您提供正确的坐标以使进度视图居中.对我来说,它显示了细胞下方的指标.

注意 - 我使用的是最新版本的SDWebImage代码,因此方法略有不同.我也在使用UIButton作为imageView

试试这个:

NSURL *url = [NSURL URLWithString:@"www.someimageurl.com"];
__block UIActivityIndicatorView *activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
activityIndicator.frame = cell.imageView.bounds;
[cell.imageView addSubview:activityIndicator];
[activityIndicator startAnimating];
[cell.imageView setImageWithURL:url forState:UIControlStateNormal completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType) {
    [activityIndicator removeFromSuperview];
}];
Run Code Online (Sandbox Code Playgroud)


Hac*_*ord 5

我相信最新版本的sdwebimage这是一个更好的方法.

[self.customImageView setImageWithURL:imageURL
                             placeholderImage:nil
                                      options:nil
                                     progress:^(NSUInteger receivedSize, long long expectedSize) { [self.activityIndicator startAnimating]; }
                                    completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType) { [self.activityIndicator stopAnimating]; }];
Run Code Online (Sandbox Code Playgroud)

注意:如果您没有属性设置,很明显self.activityindicator将无法正常工作.

我会用Michael Frederick的例子来创建activityindicator.