как показать индикацию активности в каждой ячейке перед загрузкой изображения полностью (с использованием SDWebImage) [дубликат]

Я лично считаю, что это нормально для функции возврата кортежа или None. Однако функция должна возвращать не более двух разных типов, а вторая должна быть None. Функция никогда не должна возвращать строку и список, например.

12
задан raaz 22 February 2012 в 04:38
поделиться

4 ответа

Работает как прелесть для меня:

Swift 3:

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

Swift 4: (Edit: Updates)

imgView.sd_setShowActivityIndicatorView(true)
imgView.sd_setIndicatorStyle(.gray)
imgView.sd_setImage(with: URL(string: urlString), placeholderImage: UIImage(named: "placeholder"))
26
ответ дан Ankit Kumar Gupta 15 August 2018 в 15:44
поделиться
  • 1
    Это должен быть выбранный ответ. Действительно его очарование – Karthik K M 3 March 2017 в 10:09
  • 2
    Нужно ли мне называть анимацию остановки или что-то подобное, когда изображение загружается в изображение? – JK140 3 May 2017 в 16:07
  • 3
    Нет, как только изображение будет извлечено, ваш индикатор автоматически скроется. Пожалуйста, воздержитесь, если это решит вашу проблему. – Ankit Kumar Gupta 4 May 2017 в 06:43
  • 4
    в Swift 4 на самом деле imgView.sd_setShowActivityIndicatorView (true) imgView.sd_setIndicatorStyle (.gray) – Carioni 4 April 2018 в 20:57
  • 5
    @Carioni: Спасибо, обновил ответ – Ankit Kumar Gupta 5 April 2018 в 10:09

Последнее решение

Вы можете скачать UIActivityIndicator-for-SDWebImage , что является самым простым способом добавить UIActivityView в ваш просмотр SDWebImage . Используя CocoaPods, просто добавьте эту строку в свой файл:

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];
4
ответ дан EridB 15 August 2018 в 15:44
поделиться

лучший способ - добавить ActivityIndicator во все функции setImage в UIImageView + WebCache.m, после чего вы удалите его в «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];
}

, и вы удаляете его с анимацией fade;):

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

 }
3
ответ дан Red Mak 15 August 2018 в 15:44
поделиться
  • 1
    Это сбой в моем конце, что приводит к ошибке ошибки утверждения при загрузке изображения. – Gaurav 25 July 2012 в 10:30
  • 2
    Я просто загружаю и использую последнюю версию в github, и она отлично работает (ios 5.1). и кажется, что imageWithURL: устарел, плохо попробуйте работать в новой версии для этого, но вы должны дать нам некоторый код (используете ли вы UIImageView gategorie?) – Red Mak 25 July 2012 в 11:57
  • 3
    когда я использую ваш код для добавления индикатора активности, он будет давать мне ошибку утверждения, но без индикатора активности другой код анимации будет работать как шарм. если вы попробуете рассказать мне о новой версии, это будет полезно для меня. – Gaurav 25 July 2012 в 12:01

Лучшим способом, который я нашел для этого, является использование класса 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
}

Если у вас несколько кнопок, у вас могут возникнуть проблемы с определением того, какое изображение принадлежит к какой кнопке после загрузки изображения. В этом случае вам может потребоваться подклассом кнопок, который обрабатывает загрузку, как описано выше, а затем обновляет собственное изображение.

Надеюсь, что это поможет.

3
ответ дан stephenmuss 15 August 2018 в 15:44
поделиться