2015-10-27 4 views
1

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

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

    }]; 


} 

ответ

0

Вы добавляете новый 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]; 

В качестве альтернативы, вы можете использовать this библиотеку или this one который находится в SDWebImage документации referred to.

Что касается вопроса фон нить, оберните обновление прогресса в диспетчерский блок:

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

Я обновил код с вашим кодом. Также отредактирован вопрос, и теперь представление прогресса даже не видно. Посмотрите на вопрос в коде. В чем может быть проблема? –

0

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

К этому стручка можно реализовать

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

ProgressViews.

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

Например

-(void)nkv_setImageWithURL:(NSURL *)url usingProgressViewType:(ProgressViewType)progressViewType orCustomProgressView:(UIProgressView *)progressView; 
+1

Хотя это теоретически может ответить на вопрос, [было бы предпочтительнее] (// meta.stackoverflow.com/q/8259) включить сюда основные части ответа и предоставить ссылку для справки. –

0

Swift 4

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