Показать индикатор активности в SDWebImage
Я использую изображение SDWebView, и я хочу показать индикатор активности в качестве заполнителя, при извлечении изображения из удаленного.
я попробовал ответить Малека здесь как показать индикатор активности в SDWebImage, но, кажется,
UIImage *cachedImage = [manager imageWithURL:url];
устарела.
есть ли кто-нибудь, использующий эту библиотеку, который мог бы сказать мне, как я могу вставить индикатор активности при загрузке изображение?
редактировать
следуя указаниям Майкла Фредерика, я закончил с этим кодом, и все работает нормально.
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];
15 ответов
эта вилка имеет поддержку этой функции. Взгляните на разница.
но, в общем, вы можете сделать это довольно легко без использования вилки:
__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];
вот как вы это делаете:
[imageView setIndicatorStyle:UIActivityIndicatorViewStyleWhite];
[imageView setShowActivityIndicatorView:true];
[imageView sd_setImageWithURL:[NSURL URLWithString:imageUrl] placeholderImage:[UIImage imageNamed:@"defaultl_image"]];Это мое решение. В этом файле: UIImageView+WebCache.м
найдите этот метод и измените его так:
- (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];
     }];
}
последнее решение
можно скачать 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];
приведенный выше код немного неправильный. Линия ' activityIndicator.центр = графическое представление.центр" не дает вам правильных координат для центра представления прогресса. Для меня он показывал индикатор под ячейкой.
Примечание - я использую последнюю версию кода SDWebImage, поэтому метод немного отличается. Я также использую UIButton для imageView
попробуйте это:
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];
}];
Я считаю, что с последней версией sdwebimage это лучший метод.
[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]; }];
Примечание: Если у вас нет настройки свойства, очевидно, самостоятельно.activityindicator не будет работать.
Я бы использовал пример Майкла Фредерика для создания activityindicator вместо этого.
SDWebImage имеет встроенный индикатор Acitvity, который отлично работает. Попробуйте это:
Swift 3:
imgView.setShowActivityIndicator(true)
imgView.setIndicatorStyle(.gray)
imgView.sd_setImage(with: URL(string: urlString), placeholderImage: UIImage(named: "placeholder"))
[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;
}];
на основе ответа Can Ürek вы можете создать Категорию, чтобы упростить ее использование в нескольких приложениях и без изменения структуры SDWebImage.
заголовочный файл:
#import <UIKit/UIKit.h>
#import <SDWebImage/UIImageView+WebCache.h>
@interface UIImageView (WebCacheWithActivityIndicator)
- (void)setImageShowingActivityIndicatorWithURL:(NSURL *)url completed:(SDWebImageCompletedBlock)completedBlock;
@end
файл:
#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
надеюсь, это поможет вам, ребята
Ура
решение обновлено для Swift 2.0 для использования SDWebImage для Загрузки URL-адреса изображения
imageView.setShowActivityIndicatorView(true)
imageView.setIndicatorStyle(.White)
тот же код, что и выше в 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()
другое решение-использовать анимированное изображение в качестве изображения-заполнителя с помощью:
[UIImage animatedImageNamed:@"animated_placeholder" duration:1]
с обновленными библиотека (разрешен сбой на iOS 8), у нас есть ниже метод -
- (void)sd_setImageWithURL:(NSURL *)url 
{
    [self sd_setImageWithURL:url placeholderImage:nil options:0 progress:nil completed:nil];
}
Как мы можем видеть возможность добавить блок прогресса и завершенный блок, мы можем просто добавить индикатор активности в блоке прогресса и удалить в блоке завершения.
индивидуальный метод для добавления индикатора активности здесь -
- (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];
        }
    }];
}
Это добавит UIActivityIndicatorView в центр UIImageView при загрузке изображения в процессе и удалить на завершение.
мой список довольно отстает, когда пользователь прокручивает список вверх и вниз несколько раз. Я узнал, что activityindicator был добавлен бесконечно, когда cellforitematindexpath повторно вызывается.
чтобы решить эту проблему, добавьте тег в activityindicator:
activityIndicator.tag = 9999;
перед созданием UIActivityIndicator добавьте эти строки, чтобы удалить предыдущий activityindicator перед добавлением нового:
UIView* toDeleteLoader = [cell viewWithTag:9999];
if(toDeleteLoader != nil){
    [toDeleteLoader removeFromSuperview];
}
Примечание: метка содержание может быть любым номера, которые не будут использоваться в вашей камере.
лучшее решение, которое сработало для меня, ниже. Это красиво и обнадеживает, чтобы показать индикатор прогресса при загрузке изображения. Я использовал UICircularSlider как округленный вид прогресса. Вы также можете попробовать.
    [_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];
    }];
здесь _progress пример UICircularSlider
