objective-c uiactivityindicatorview sdwebimage

objective c - Mostrar indicador de actividad en SDWebImage



objective-c uiactivityindicatorview (15)

Estoy usando la imagen SDWebView y quiero mostrar un indicador de actividad como marcador de posición, mientras obtengo la imagen desde el control remoto.

Probé la respuesta de Malek aquí Cómo mostrar un indicador de actividad en SDWebImage , pero parece que

UIImage *cachedImage = [manager imageWithURL:url];

es obsoleto.

¿Hay alguien usando esta biblioteca que pueda decirme cómo puedo insertar un Indicador de Actividad mientras cargo la imagen?

EDITAR

Siguiendo las indicaciones de Michael Frederick, terminé con este código y todo funciona 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];


Ultima solucion

Puede descargar UIActivityIndicator-for-SDWebImage , que es la manera más fácil de agregar un UIActivityView a su vista de SDWebImage . Usando CocoaPods, solo agrega esta línea a tu archivo de archivo:

pod ''UIActivityIndicator-for-SDWebImage''

Puedes usar una de estas líneas dependiendo de tus preferencias:

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

Ejemplo de uso

Solo importa

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

y usa este código

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


Así es como lo haces:

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


Con la SDWebImage actualizada (Resolved Crash en iOS 8), tenemos el siguiente método:

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

Como podemos ver la opción para agregar bloque de progreso y bloque completo, simplemente podemos agregar el indicador de Actividad en el bloque de progreso y eliminarlo en el bloque de finalización.

Método personalizado para agregar el Indicador de actividad aquí -

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

Esto agregará UIActivityIndicatorView al centro de UIImageView cuando la descarga de la imagen esté en progreso y se elimine al finalizar.


Creo que con la última versión de sdwebimage este es un mejor método.

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

Nota: Si no tiene una configuración de propiedad, obviamente self.activityindicator no funcionará.

Yo usaría el ejemplo de Michael Frederick para crear el indicador de actividad en su lugar.


El código anterior es ligeramente incorrecto. La línea ''activityIndicator.center = imageView.center'' no le da las coordenadas correctas para centrar la vista de progreso. Para mí, estaba mostrando el indicador debajo de la celda.

Nota: Estoy usando la última versión del código SDWebImage, por lo que el método es ligeramente diferente. También estoy usando un UIButton para el imageView

Prueba esto:

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


Esa es mi solución. En ese archivo: UIImageView + WebCache.m

Encuentra ese método y cambia así:

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


La mejor solución que funcionó para mí es la siguiente. Es hermoso y alentador mostrar el indicador de progreso cuando la imagen se está descargando. UICircularSlider como vista de progreso redondeada. También puedes probarlo.

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

Aquí _progress es una instancia de UICircularSlider


Mi lista es bastante lenta cuando el usuario desplaza la lista hacia arriba y hacia abajo varias veces. Descubrí que elindicador de actividad se había agregado infinitamente cuando se llamaba repetidamente a cellForItemAtIndexPath.

Para resolver esto, agrega una etiqueta en tu indicador de actividad:

activityIndicator.tag = 9999;

Antes de crear el UIActivityIndicator, agregue estas líneas para eliminar el indicador de actividad anterior antes de agregar el nuevo:

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

Nota: el contenido de la etiqueta puede ser cualquier número que no se utilizará en su celda.


Otra solución es usar una imagen animada como la imagen de marcador de posición usando:

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


SDWebImage tiene un indicador de actividad incorporado que funciona perfectamente. Prueba esto:

Swift 3:

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


Según la respuesta de Can Ürek, es posible que desee crear una categoría para que sea más fácil de usar en múltiples aplicaciones y sin modificar el marco SDWebImage .

Archivo de cabecera:

#import <UIKit/UIKit.h> #import <SDWebImage/UIImageView+WebCache.h> @interface UIImageView (WebCacheWithActivityIndicator) - (void)setImageShowingActivityIndicatorWithURL:(NSURL *)url completed:(SDWebImageCompletedBlock)completedBlock; @end

Archivo de implementación:

#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

Espero te ayude chicos

Aclamaciones


Esta horquilla tiene soporte para esta funcionalidad. Echa un vistazo a la diferencia .

Pero, en general, puede hacerlo con bastante facilidad sin usar ese tenedor:

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


Mismo código que el anterior en 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()


Solución actualizada para Swift 2.0 para usar SDWebImage para cargar URL de imagen

imageView.setShowActivityIndicatorView(true) imageView.setIndicatorStyle(.White)


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