Круговой индикатор выполнения в ImageView с использованием блока SDWebImage

Я пытаюсь реализовать Instagram, как круговой индикатор выполнения для загрузки изображений с помощью SDWebImage. 1. Я использую этот кусок кода, но он не работает должным образом. Индикатор выполнения не скрывается после применения изображения к просмотру изображения.

  1. Проблема повторного использования клеток также вызывает некоторые проблемы.
  2. Также выдается предупреждение, что я пытаюсь обновить индикатор выполнения в фоновом потоке.

Как я могу избавиться от этих проблем

- (void)setImageInImageView:(UIImageView *)imgv withURLString:(NSString *)str_url {

  //GuestDefaultProfilePic
    [imgv sd_setImageWithURL:[NSURL URLWithString:str_url] placeholderImage:[UIImage imageNamed:@"ImageGalleryBackground"] options: SDWebImageHighPriority progress:^(NSInteger receivedSize, NSInteger expectedSize){

        NSLog(@"the progress is %f", ((receivedSize*1.0f) * 100) /  expectedSize);
        progressView = [imgv viewWithTag:4321];

        if(progressView==nil)
        {
            progressView = [[THCircularProgressView alloc] initWithFrame:CGRectMake(imgv.center.x - 20 , imgv.center.y-20 , 60 , 60)];
            progressView.lineWidth = 5.0f;
            progressView.progressColor = [UIColor whiteColor];
            progressView.progressBackgroundColor = [UIColor grayColor];

            progressView.centerLabelVisible = YES;
            progressView.tag = 4321;
            [imgv addSubview:progressView];
        }

        dispatch_async(dispatch_get_main_queue(), ^{
            [progressView setPercentage:(receivedSize*1.0f) /  expectedSize];
        });
        if(receivedSize >= expectedSize)
        {
            progressView.hidden = YES;
        }
    }
    completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL){

       [progressView setHidden:YES];
        [progressView removeFromSuperview];
        [progressView setPercentage:0];
        [imgv setImage:image];

    }];


}

4 ответа

Вы можете попробовать это,

  1. устанавливать pod "MBCircularProgressBar"
  2. Возьмите UIView для вашей пользовательской ячейки так, как вы хотите видеть прогресс и установите класс MBCircularProgressBarView.

    @IBOutlet weak var progressView: MBCircularProgressBarView!
    
    
        cell.imgAlbum.sd_setImage(with: URL(string: imageUrl), placeholderImage: UIImage(named: "placeholderImage"), options: .highPriority, progress: { (receivedSize :Int, ExpectedSize :Int, url:URL?) in
    
        DispatchQueue.main.async {
            cell.ActivityView.isHidden = false;
            cell.ActivityView.value = CGFloat(receivedSize)
            cell.ActivityView.maxValue = CGFloat(ExpectedSize)
        }
    }) { (image : UIImage?, error : Error?, cacheType : SDImageCacheType?, url:URL?) in
    
        DispatchQueue.main.async {
            UIView.animate(withDuration: 3.0, animations: {() -> Void in
                cell.ActivityView.isHidden = true;
            })}
    
        cell.imgBlur.removeBlurEffect()
    }
    

Swift 4

mediumImageView.setImageWith(imageUrl, placeholderImage: placeHolder, options: [.progressiveDownload], usingProgressIndicatorWithProgressTintColor: UIColor.red, andTrackTintColor: UIColor.blue))

Вы добавляете новый progressView каждый раз, когда вызывается блок прогресса. Вместо этого сделайте это:

THCircularProgressView *progressView = [imgv viewWithTag:4321];

if(progressView==nil)
{
  progressView = [[THCircularProgressView alloc] initWithFrame:CGRectMake(imgv.center.x - 20 , imgv.center.y-20 , 60 , 60)];
  progressView.lineWidth = 5.0f;
  progressView.progressColor = [UIColor whiteColor];
  progressView.progressBackgroundColor = [UIColor grayColor];

  progressView.centerLabelVisible = YES;
  progressView.tag = 4321;
  [imgv addSubview:progressView];
}

[progressView setPercentage:(receivedSize*1.0f) /  expectedSize];

Кроме того, вы можете использовать эту библиотеку или ту, которая упоминается в SDWebImage Docs.

Что касается проблемы с фоновым потоком, оберните обновление прогресса в блоке отправки:

dispatch_async(dispatch_get_main_queue(), ^{
  [progressView setPercentage:(receivedSize*1.0f) /  expectedSize];
});

Проверьте Cocoapod SDWebImage-CircularProgressView на GitHub:
https://github.com/NikKovV/SDWebImage-CircularProgressView

С помощью этого модуля вы можете реализовать

  • Циркулярный (с использованием DACircularProgress)
  • линейный
  • изготовленный на заказ

ProgressViews.

Это категория UIImageView.

Например

-(void)nkv_setImageWithURL:(NSURL *)url usingProgressViewType:(ProgressViewType)progressViewType orCustomProgressView:(UIProgressView *)progressView;
Другие вопросы по тегам