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];
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];
Voici comment procéder:
[imageView setIndicatorStyle:UIActivityIndicatorViewStyleWhite];
[imageView setShowActivityIndicatorView:true];
[imageView sd_setImageWithURL:[NSURL URLWithString:imageUrl] placeholderImage:[UIImage imageNamed:@"defaultl_image"]];
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];
}];
}
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;
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];
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];
}];
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é.
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"))
Pour Swift 5.0 et SDWebImage 5.0:
Remplacer
imageView.sd_setShowActivityIndicatorView(true)
imageView.sd_setIndicatorStyle(.gray)
Par
imageView.sd_imageIndicator = SDWebImageActivityIndicator.gray
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()
SdWebImage 5.
YOUR_IMAGEVIEW.sd_imageIndicator = SDWebImageActivityIndicator.gray
[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;
}];
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)
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é
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.
Une autre solution consiste à utiliser une image animée comme image d'espace réservé en utilisant:
[UIImage animatedImageNamed:@"animated_placeholder" duration:1]
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
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.