Круговой индикатор выполнения в ImageView с использованием блока SDWebImage
Я пытаюсь реализовать Instagram, как круговой индикатор выполнения для загрузки изображений с помощью SDWebImage. 1. Я использую этот кусок кода, но он не работает должным образом. Индикатор выполнения не скрывается после применения изображения к просмотру изображения.
- Проблема повторного использования клеток также вызывает некоторые проблемы.
- Также выдается предупреждение, что я пытаюсь обновить индикатор выполнения в фоновом потоке.
Как я могу избавиться от этих проблем
- (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 ответа
Вы можете попробовать это,
- устанавливать
pod "MBCircularProgressBar"
Возьмите 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;