8

UICollectionViewインターネットからダウンロードした画像のグリッドを表示する場所があります。私はSDWebImage画像をロードするために使用しています。私が直面している問題は、をスクロールするUICollectionViewと、セルが繰り返されて同じ画像が表示されることがあることです。しかし、セルがビューの外にスクロールされてから元に戻されると、正しい画像が設定されます。

-(UICollectionViewCell*) collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{

    NSString *CellIdentifier = @"Gallery_Cell";

    GalleryCell *cell;

    if (cell==nil) {
        cell= (GalleryCell *)[self.flowCollection dequeueReusableCellWithReuseIdentifier:CellIdentifier forIndexPath:indexPath];

        ImageItem *dets = [self.imageList objectAtIndex:indexPath.row];

        NSURL *mainImageURL = [NSURL URLWithString:dets.smallImageURL];

        cell.image.contentMode = UIViewContentModeScaleAspectFill;
        cell.image.clipsToBounds = YES;                

        [cell.image setImageWithURL:mainImageURL placeholderImage:nil];

    }

    return cell;

}

これは他の誰かに起こりましたか?ポインタをいただければ幸いです。

4

6 に答える 6

5

「UICollectionView クラス リファレンス」には次のように記載されています。指定された識別子のクラスを登録し、新しいセルを作成する必要がある場合、このメソッドは initWithFrame: メソッドを呼び出してセルを初期化します。nib ベースのセルの場合、このメソッドは提供された nib ファイルからセル オブジェクトをロードします。既存のセルを再利用できる場合、このメソッドは代わりにセルの prepareForReuse メソッドを呼び出します。"

GalleryCell セル クラスの prepareForReuse メソッドはありますか?

セル クラスは、UICollectionReusableView クラスのサブクラスである必要があります。そして、それを確認してください。

于 2013-10-12T18:36:37.883 に答える
1

この方法を使用すると、この vl は確実に 100% 機能します。

- (void)collectionView:(UICollectionView *)collectionView didEndDisplayingCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath;
{
   GalleryCell *cell1 = (GalleryCell*)[_resumeCollectionView cellForItemAtIndexPath:indexPath];
    cell1= nil;

}
于 2014-12-16T20:28:41.933 に答える
1

最終的に、UICollectionView の「didEndDisplayingCell」メソッドを使用して、現在の画像のダウンロードを終了し、画像を nil に設定しました。これは完璧に機能し、画像の「シャッフル」や繰り返しはもうありませんでした。:)

于 2013-12-09T12:40:53.497 に答える
0

セルは再利用されるため、無条件で cellForIndexPath: に内容を設定する必要があります。あなたのコードは最終的に画像を設定しますが、画像が一時的に古い値、つまり再利用される前に設定された値として残る可能性があります。

簡単な解決策は、(おそらく) そのsetImageWithURL呼び出しにプレースホルダー画像を提供することです。SDImage ライブラリについてはわかりませんが、imageView の画像が提供されている場合は、すぐにその画像をプレースホルダー画像に設定すると推測されます。

プレースホルダー画像がない、または必要ない場合は、サブクラスに実装prepareForReuseしてUICollectionViewCell、そこで imageView をクリアできます。

于 2013-10-12T18:37:27.543 に答える