在SDWebImage中显示活动指示器

问题描述 投票:30回答:17

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

我在这里尝试过Malek的答案How to show an activity indicator in SDWebImage,但似乎是这样

UIImage *cachedImage = [manager imageWithURL:url];

已弃用。

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

编辑

根据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];
objective-c uiactivityindicatorview sdwebimage
17个回答
47
投票

This fork支持此功能。看看the diff

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

__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];

2
投票

针对Swift 2.0更新了解决方案,使用SDWebImage加载图像URL

[cell.dreamImageView setImageWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@",dream.thumbnail]] placeholderImage:[UIImage imageNamed:@"dream_bg_2.png"] options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) {

    CGFloat domandeFloat = [[NSNumber numberWithInt: receivedSize] floatValue];
    CGFloat corretteFloat = [[NSNumber numberWithInt: expectedSize] floatValue];


    float currentProgress = domandeFloat/corretteFloat;

     NSLog(@"progress %f",currentProgress);
    cell.progressView.progress = currentProgress;

    //[self.dreamsTableView reloadData];


} completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType) {

    cell.progressView.hidden = YES;
}];

2
投票

SdWebImage 5.0

imageView.setShowActivityIndicatorView(true)

imageView.setIndicatorStyle(.White)

2
投票

对于Swift 5.0和SDWebImage 5.0:

更换

YOUR_IMAGEVIEW.sd_imageIndicator = SDWebImageActivityIndicator.gray

通过

imageView.sd_setShowActivityIndicatorView(true)
imageView.sd_setIndicatorStyle(.gray)

1
投票

根据CanÜrek的回答,您可能想要创建一个类别,以便在多个应用程序中更容易使用,而无需修改SDWebImage框架。

头文件:

imageView.sd_imageIndicator = SDWebImageActivityIndicator.gray

实施文件:

#import <UIKit/UIKit.h>

#import <SDWebImage/UIImageView+WebCache.h>

@interface UIImageView (WebCacheWithActivityIndicator)

- (void)setImageShowingActivityIndicatorWithURL:(NSURL *)url completed:(SDWebImageCompletedBlock)completedBlock;

@end

希望它可以帮助你们

干杯


0
投票

另一种解决方案是使用动画图像作为占位符图像:

#import "UIImageView+WebCacheWithActivityIndicator.h" @implementation UIImageView (WebCacheWithActivityIndicator) - (void)setImageShowingActivityIndicatorWithURL:(NSURL *)url completed:(SDWebImageCompletedBlock)completedBlock { UIActivityIndicatorView* activityIndication = [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; [activityIndication setFrame:CGRectMake((self.frame.size.width - activityIndication.frame.size.width) / 2 , (self.frame.size.height - activityIndication.frame.size.height) / 2 , activityIndication.frame.size.width , activityIndication.frame.size.width)]; [self addSubview:activityIndication]; [activityIndication startAnimating]; [self setImageWithURL:url completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType) { if(completedBlock) { completedBlock(image,error,cacheType); } [activityIndication stopAnimating]; [activityIndication removeFromSuperview]; }]; } @end


0
投票

随着更新的[UIImage animatedImageNamed:@"animated_placeholder" duration:1](iOS 8上的已解决崩溃),我们有以下方法 -

library

我们可以看到添加进度块和已完成块的选项,我们只需在进度块中添加活动指示器并在完成块中删除。

在此处添加活动指标的自定义方法 -

- (void)sd_setImageWithURL:(NSURL *)url 
{
    [self sd_setImageWithURL:url placeholderImage:nil options:0 progress:nil completed:nil];
}

这将在正在下载图像时将UIActivityIndi​​catorView添加到UIImageView的中心,并在完成时删除。


0
投票

当用户反复上下滚动列表时,我的列表相当滞后。我发现当重复调用cellForItemAtIndexPath时,activityindicator已被无限添加。

要解决此问题,请在activityindicator中添加标记:

- (void)sd_setImageWithURL:(NSURL *)url {

    [self sd_setImageWithURL:url placeholderImage:nil options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) {
        UIActivityIndicatorView *activity = nil;
        activity = (UIActivityIndicatorView *)[self viewWithTag:100000];
        if (!activity) {
            activity = [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
            [activity setTag:100000];
            [activity setHidesWhenStopped:YES];
            [activity setCenter:CGPointMake(self.frame.size.width/2.0f,self.frame.size.height/2.0f)];
            [self addSubview:activity];
        }
        else {
            [activity setCenter:CGPointMake(self.frame.size.width/2.0f,self.frame.size.height/2.0f)];
        }
        [activity startAnimating];

    } completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
        UIActivityIndicatorView *activity = (UIActivityIndicatorView *)[self viewWithTag:100000];
        if ([activity isKindOfClass:[UIActivityIndicatorView class]]) {
            [activity stopAnimating];
        }
    }];
}

在创建UIActivityIndi​​cator之前,添加这些行以删除之前的activityindicator,然后再添加新的:

activityIndicator.tag = 9999;

注意:标记内容可以是不在单元格中使用的任何数字。


0
投票

对我有用的最佳解决方案如下。在下载图像时显示进度指示器是美观且令人鼓舞的。我使用UIView* toDeleteLoader = [cell viewWithTag:9999]; if(toDeleteLoader != nil){ [toDeleteLoader removeFromSuperview]; } 作为圆形进度视图。你也可以尝试一下。

UICircularSlider

这里 [_imgPost sd_setImageWithURL:urlPost placeholderImage:zeroImage options:SDWebImageContinueInBackground progress:^(NSInteger receivedSize, NSInteger expectedSize) { CGFloat domandeFloat = [[NSNumber numberWithInteger: receivedSize] floatValue]; CGFloat corretteFloat = [[NSNumber numberWithInteger: expectedSize] floatValue]; float currentProgress = (domandeFloat/corretteFloat)*100; NSLog(@"progress %.f%%",currentProgress); DBG(@"%li, %li", receivedSize, expectedSize); [_progress setValue:currentProgress]; } completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { [_progress setHidden:YES]; }]; _progress的一个例子


22
投票

这是你如何做到的:

[imageView setIndicatorStyle:UIActivityIndicatorViewStyleWhite];
[imageView setShowActivityIndicatorView:true];
[imageView sd_setImageWithURL:[NSURL URLWithString:imageUrl] placeholderImage:[UIImage imageNamed:@"defaultl_image"]];

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];
     }];
}

15
投票

最后解决方案

你可以下载qazxsw poi,这是在你的UIActivityIndicator-for-SDWebImage视图中添加活动视图的最简单方法。使用CocoaPods,只需将此行添加到podfile:

SDWebImage

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

pod 'UIActivityIndicator-for-SDWebImage'

使用示例

只需导入

- (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;

并使用此代码

#import <UIActivityIndicator-for-SDWebImage/UIImageView+UIActivityIndicatorForSDWebImage.h>

5
投票

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

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

试试这个:

[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];

5
投票

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

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];
}];

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

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


4
投票

SDWebImage具有内置的活动指示器,可以完美地运行。试试这个:

斯威夫特3:

[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]; }];

3
投票

与SWIFT 4中的上述代码相同:

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

2
投票
let activityIndicator = UIActivityIndicatorView.init(activityIndicatorStyle: UIActivityIndicatorViewStyle.gray)
    activityIndicator.center = addImage.center
    activityIndicator.hidesWhenStopped = true

    addImage.sd_setImage(with: URL(string: feed.image), completed: { (image: UIImage?, error: Error?, cacheType: SDImageCacheType, imageURL: URL?) in
        activityIndicator.removeFromSuperview()
    })

    addImage.addSubview(activityIndicator)
    activityIndicator.startAnimating()
© www.soinside.com 2019 - 2024. All rights reserved.