4

画像が読み込まれる前に UIActivityIndi​​cator がセルに表示される UICollectionView があります。これは、UIImageView+AFNetworking ブロックでの成功または失敗に関係なく却下されます。ただし、アニメーションを非表示にしたり停止したりしていないように見える残りのアクティビティインジケーターが表示されることがあります。

これは私の cellForItemAtIndexPath の一部です:

- (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath {
...
NSURL *imageURL = [NSURL URLWithString:[tmpcamera objectForKey:@"url"]];
NSURLRequest *imageRequest = [NSURLRequest requestWithURL:imageURL cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:10];

UIActivityIndicatorView *activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite];
activityIndicator.hidesWhenStopped = YES;
activityIndicator.hidden = NO;
activityIndicator.frame = CGRectMake(0, 0, 130, 110);
activityIndicator.tag = 10;

[cell.imageView addSubview:activityIndicator];
[activityIndicator startAnimating];

__weak typeof(FavouriteCell) *weakImage = cell;
[cell.imageView setImageWithURLRequest:imageRequest
                      placeholderImage:[UIImage imageNamed:@"trans50.png"]
                               success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *i)
 {
     [activityIndicator stopAnimating];
     activityIndicator.hidden = YES;
     [activityIndicator removeFromSuperview];
     [weakImage.imageView setImage:i];

 }
                               failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error)
 {
     [activityIndicator stopAnimating];
     activityIndicator.hidden = YES;
     [activityIndicator removeFromSuperview];
     [weakImage.imageView setImage:[UIImage imageNamed:@"errorimage.png"]];
 }];
...
}

このコードが問題をデバッグするのに十分かどうかはわかりませんが、アイデアをいただければ幸いです。

私が話していることのサンプルスクリーンショットは次のとおりです。

サンプル

4

1 に答える 1

3

画像リクエストが成功または失敗する前に(スクロールなどによって)セルがリサイクル/再利用される可能性があるため、セルに「孤立した」アクティビティインジケーターが表示される可能性があります。

イベントの順序:

  1. セルが読み込まれ、画像の読み込みが試行され、アクティビティ インジケーターが開始されます
  2. 画像が読み込まれる前にユーザーがスクロールします。セルはリサイクルされます。
  3. セルは再利用されます。新しいアクティビティ インジケーターが追加され、以前のイメージの読み込みが中止されます (したがって、以前の成功/失敗ブロックは呼び出されません)。古いアクティビティ インジケータと新しいアクティビティ インジケータが両方ともセル上にあり、古いアクティビティ インジケータはまだ実行されています。

この問題を回避するためのいくつかの提案:

  1. アクティビティ インジケーターを含むカスタム セルを作成します。
  2. アクティビティ インジケーターを作成するときに、インジケーターのタグ プロパティに番号を割り当ててから、セルを再利用するときに viewWithTag: を介してアクティビティ インジケーターが既に存在するかどうかを調べます。すでに存在する場合は既存のものを使用し、そうでない場合は新しいものを作成します。
于 2013-10-27T03:31:55.247 に答える