滚动时collectionView中的图像正在更改

saj*_*nan 3 objective-c ios uicollectionview uicollectionviewcell uicollectionviewlayout

我正在使用xcode 8.3。我有一个CollectionView。我已经从Web服务下载了图像并将图像放置在每个CollectionView单元中。但是,当我滚动CollectionView时,每个单元格中的图像都在变化。几分钟后,它将显示正确的图像。我已经尝试了许多stackoverflow中可用的解决方案。但我没有得到解决方案。请帮我。

小智 5

就像其他人说的那样,这很可能是因为您要使可重复使用的单元格出队(应该如此),并将cell.imageView.image属性设置为Web图像。

这里的问题是,因为iOS通过“重用”这些单元格来节省内存,所以它们实际上是内存中的相同单元格。因此,当它滚动离开屏幕的一侧并消失时。随着新单元格的滚动而不是创建新的单独的单元格,它仅使用它已经离开屏幕的现有单元格。意味着您的旧图像仍然是单元格中显示的图像。

标准做法是在cellForRowAtIndexPath:方法中设置单元格的内容。但是,如果将其设置为异步获取的图像,则在完全有可能(有可能)的情况下,单元格会在获取新图像之前与旧图像一起出现在屏幕上。大概一旦下载了图像,它就不再是一个大问题,因为它们应该立即从缓存中返回。

这里简单的解决方法是要么在每次在单元格中设置图像之前先将其剔除掉,要么最好使用一个占位符图像。

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    MyCustomCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"CELL_IDENTIFIER" forIndexPath:indexPath];

    // This will clear any existing image from the cell about to be displayed it is an option
    //[cell.imageView setImage:nil];

    if (ImageExistsLocally)
    {
        cell.imageView.image = [UIImage imageWithContentsOfFile:@"SomeImagePath"];
    } 
    else 
    {
        [cell.cellImageView sd_setImageWithURL:yourRemoteImage.thumbnailUrl
                              placeholderImage:[UIImage imageNamed:PlaceHolderImageName]
                                     completed:nil];
    }
    return cell;
}
Run Code Online (Sandbox Code Playgroud)

请注意,这sd_setImageWithURL是我认为有人在SDWebImage库中提到的。https://cocoapods.org/pods/SDWebImage