27

現在、以下のことに従って、SDWebImageをプロジェクトに統合しています

1)#import "UIButton+WebCache.h"

2)[button 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"))

Swift 4: (編集: 更新)

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

スウィフト 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 に答える
4

これを行うために私が見つけた最良の方法は、SDWebImageManagerクラスを使用することです。次に、ViewControllerまたはその他のクラスが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 に答える