web-dev-qa-db-fra.com

Afficher l'indicateur d'activité dans SDWebImage

J'utilise une image SDWebView et je souhaite afficher un indicateur d'activité comme espace réservé, tout en récupérant l'image à distance.

J'ai essayé la réponse de Malek ici Comment afficher un indicateur d'activité dans SDWebImage , mais il semble que

UIImage *cachedImage = [manager imageWithURL:url];

est obsolète.

Y a-t-il quelqu'un qui utilise cette bibliothèque qui pourrait me dire comment puis-je insérer un indicateur d'activité lors du chargement de l'image?

[~ # ~] modifier [~ # ~]

En suivant les indications de Michael Frederick, je me suis retrouvé avec ce code et tout fonctionne bien.

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];
31
Phillip

Cette fourchette prend en charge cette fonctionnalité. Jetez un oeil à le diff .

Mais, en général, vous pouvez le faire assez facilement sans utiliser cette fourche:

__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];
47
Michael Frederick

Voici comment procéder:

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

Voilà ma solution. Dans ce fichier: UIImageView + WebCache.m

Trouvez cette méthode et changez comme ça:

- (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];
     }];
}
17
Can Ürek

Dernière solution

Vous pouvez télécharger IActivityIndicator-for-SDWebImage , qui est le moyen le plus simple d'ajouter une UIActivityView à votre ( SDWebImage vue. En utilisant CocoaPods, ajoutez simplement cette ligne à votre podfile:

pod 'UIActivityIndicator-for-SDWebImage'

Vous pouvez utiliser l'une de ces lignes en fonction de vos préférences:

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

Exemple d'utilisation

Importez simplement

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

et utilisez ce code

[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];
15
E-Riddie

Le code ci-dessus est légèrement faux. La ligne 'activityIndicator.center = imageView.center' ne vous donne pas les coordonnées correctes pour centrer la vue de progression. Pour moi, il montrait l'indicateur sous la cellule.

Remarque - J'utilise la dernière version du code SDWebImage donc la méthode est légèrement différente. J'utilise également un UIButton pour l'imageView

Essaye ça:

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

Je pense qu'avec la dernière version de sdwebimage, c'est une meilleure méthode.

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

Remarque: Si vous n'avez pas de configuration de propriété, self.activityindicator ne fonctionnera évidemment pas.

J'utiliserais plutôt l'exemple de Michael Frederick pour créer l'indicateur d'activité.

5
Hackmodford

SDWebImage a un indicateur d'activité intégré qui fonctionne parfaitement. Essaye ça:

Mises à jour: Swift 5 SDWebImage 5.x.x

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

Swift 3:

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

Pour Swift 5.0 et SDWebImage 5.0:

Remplacer

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

Par

imageView.sd_imageIndicator = SDWebImageActivityIndicator.gray
3
MichelRobico

Même code que ci-dessus dans Swift 4:

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()
3
Ignacio Oroná

SdWebImage 5.

YOUR_IMAGEVIEW.sd_imageIndicator = SDWebImageActivityIndicator.gray
3
Alfi
[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
Spydy

Solution mise à jour pour Swift 2.0 pour l'utilisation de SDWebImage pour charger l'URL de l'image

imageView.setShowActivityIndicatorView(true)

imageView.setIndicatorStyle(.White)
2
Sourabh Sharma

Sur la base de la réponse de Can Ürek, vous voudrez peut-être créer une catégorie pour la rendre plus facile à utiliser dans plusieurs applications et sans modifier le cadre SDWebImage.

En tête de fichier:

#import <UIKit/UIKit.h>

#import <SDWebImage/UIImageView+WebCache.h>

@interface UIImageView (WebCacheWithActivityIndicator)

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

@end

Fichier d'implémentation:

#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

J'espère que ça vous aide les gars

À votre santé

1
Paulo Miguel Almeida

Avec la mise à jour bibliothèque (Crash résolu sur iOS 8), nous avons la méthode ci-dessous -

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

Comme nous pouvons voir l'option d'ajouter un bloc de progression et un bloc terminé, nous pouvons simplement ajouter un indicateur d'activité dans le bloc de progression et supprimer dans le bloc d'achèvement.

Méthode personnalisée pour ajouter un indicateur d'activité ici -

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

Cela ajoutera UIActivityIndicatorView au centre de UIImageView lorsque le téléchargement d'image est en cours et supprimera à la fin.

0
Abhishek

Une autre solution consiste à utiliser une image animée comme image d'espace réservé en utilisant:

[UIImage animatedImageNamed:@"animated_placeholder" duration:1]

0
Joseph Toronto

La meilleure solution qui a fonctionné pour moi est ci-dessous. Il est beau et encourageant d'afficher un indicateur de progression lorsque l'image est téléchargée. J'ai utilisé UICircularSlider comme vue de progression arrondie. Vous pouvez également l'essayer.

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

Ici _progress est une instance de UICircularSlider

0
Vaibhav Saran

Ma liste est tout à fait à la traîne lorsque l'utilisateur fait défiler la liste de haut en bas à plusieurs reprises. J'ai découvert que l'indicateur d'activité avait été ajouté à l'infini lorsque le cellForItemAtIndexPath est appelé à plusieurs reprises.

Pour résoudre ce problème, ajoutez une balise à votre indicateur d'activité:

activityIndicator.tag = 9999;

Avant la création de l'UIActivityIndicator, ajoutez ces lignes pour supprimer l'indicateur d'activité précédent avant d'ajouter la nouvelle:

UIView* toDeleteLoader = [cell viewWithTag:9999];
if(toDeleteLoader != nil){
    [toDeleteLoader removeFromSuperview];
}

Remarque: le contenu des balises peut être n'importe quel nombre qui ne sera pas utilisé dans votre cellule.

0
Loi Hui Lye