27

目前我正在通过以下操作将 SDWebImage 集成到我的项目中

1)#import "UIButton+WebCache.h"

2)[按钮setImageWithURL:url placeholderImage:[UIImage imageNamed:@"no_photo.png"]];

因此,它将在相应按钮上方的 URL 中显示图像列表。

但是现在我想在下载图像时在按钮上方显示一个活动指示器,那么我该怎么做呢?

4

7 回答 7

84

对我来说就像一个魅力:

斯威夫特 3:

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

斯威夫特 4:(编辑:更新)

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

Swift 5:SDWebImage (5.xx)

imgView.sd_imageIndicator = SDWebImageActivityIndicator.gray
imgView.sd_setImage(with: URL(string: urlString), placeholderImage: UIImage(named: "placeholder"))

更新:对于 UIButton 使用这个

yourButton.sd_setImage(with: URL(string: urlString), for: .normal)
于 2016-12-27T06:39:13.393 回答
5

最后的解决方案

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

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>

并使用此代码

[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];
于 2014-10-02T14:48:55.303 回答
4

我发现最好的方法是使用 SDWebImageManager 类。然后,您的视图控制器或其他一些类将需要符合 SDWebImageManagerDelegate 协议。

SDWebImageManager *manager = [SDWebImageManager sharedManager];
UIImage *cachedImage = [manager imageWithURL:url];

if (cachedImage) {
    [button setImage:cachedImage];
    // stop or remove your UIActivityIndicatorView here
}
else {
    [manager downloadWithURL:url delegate:self];
}

下载图像后,将调用委托方法:

- (void)webImageManager:(SDWebImageManager *)imageManager didFinishWithImage:(UIImage *)image {
    [button setImage:image];
    // stop or remove your UIActivityIndicatorView here
}

当下载图像发生错误时,还有一个委托方法

- (void)webImageManager:(SDWebImageManager *)imageManager didFailWithError:(NSError *)error {
    // Handle error here
}

如果您有多个按钮,则在图像下载后确定哪个图像属于哪个按钮时可能会遇到问题。在这种情况下,您可能需要一个按钮子类来处理上述下载,然后更新自己的图像。

希望有帮助。

于 2012-02-27T03:38:32.457 回答
3

最好的方法是在 UIImageView+WebCache.m 的所有“setImage”函数中添加activityIndi​​cator,然后在“webImageManager:r didFinishWithImage:”中删除它,我在设备中测试它并且它工作顺利,她是一个例子:

  - (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder
 {


UIActivityIndicatorView *activity = [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:(UIActivityIndicatorViewStyleWhiteLarge)];
[activity startAnimating];
[activity setCenter:self.center];
[self addSubview:activity];
[activity release];



SDWebImageManager *manager = [SDWebImageManager sharedManager];

UIImage *cachedImage = [manager imageWithURL:url];

if (cachedImage)
{
    // the image is cached -> remove activityIndicator from view
    for (UIView *v in [self subviews])
    {
        if ([v isKindOfClass:[UIActivityIndicatorView class]])
        {
            [activity removeFromSuperview];
        }
    }
}

[self setImageWithURL:url placeholderImage:placeholder options:0];
}

然后用淡入淡出动画将其删除;):

 - (void)webImageManager:(SDWebImageManager *)imageManager didFinishWithImage:(UIImage *)image
{ 

for (UIView *v in [self subviews])
{
    if ([v isKindOfClass:[UIActivityIndicatorView class]])
    {
       // NSLog(@"-didFinishWithImage-");
        [((UIActivityIndicatorView*)v) stopAnimating];
        [v removeFromSuperview];
    }
}


[UIView beginAnimations:@"fadeAnimation" context:NULL]; 
[UIView setAnimationDuration:0.9];
self.alpha = 0;
self.image = image;
self.alpha=1;
//[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:self cache:YES]; 
[UIView commitAnimations];

 }
于 2012-05-09T10:40:38.617 回答
3

对于迅捷5

//pass true for showing indicator View
self.imageView.sd_setShowActivityIndicatorView(true)

//give style value
self.imageView.sd_setIndicatorStyle(UIActivityIndicatorView.Style.gray)

//Set your image as you are want to do
self.imageView.sd_setImage(with: URL(string: self.imageUrl), placeholderImage: UIImage())
于 2019-08-18T14:16:52.780 回答
1

对于 Swift 5,用户可以通过这种方式使用 SDWebImageManager

extension UIImageView {
    func getImage(url: String, placeholderImage:  UIImage?, success:@escaping (_ _result : Any? ) -> Void,  failer:@escaping (_ _result : Any? ) -> Void) {
        self.sd_imageIndicator = SDWebImageActivityIndicator.gray
        self.sd_setImage(with: URL(string: url), placeholderImage:  placeholderImage, options: SDWebImageOptions(rawValue: 0), completed: { image, error, cacheType, imageURL in
            // your rest code
            if error == nil {
                self.image = image
                success(true)
            }else {
                failer(false)
            }
        })
    }
}

用法:-

        var imageFeatureImage: String = ""
        
        if !imageURL.contains("https://") {
            imageFeatureImage = BASE_URL_IMAGE+imageURL
        }
       yourimageView.getImage(url: (imageFeatureImage), placeholderImage: nil) { (success) in
           yourimageView.contentMode = .scaleAspectFill
        } failer: { (failed) in
           yourimageView.image = UIImage.init(named: "placeholder")
           yourimageView.contentMode = .scaleAspectFit
        }
于 2021-02-03T09:53:12.113 回答
0

Objective-C: SDWebImage (5.xx)

[imgView setSd_imageIndicator:SDWebImageActivityIndicator.grayIndicator];
[imgView sd_setImageWithURL:[NSURL URLWithString: urlString] placeholderImage:nil];
于 2020-11-24T09:58:28.413 回答