I am working in xcode 8.3. I have a CollectionView. I have downloaded images from web sevice and placed the images in each CollectionView cells. But when i scrolling the CollectionView, images in the each cells are changing. After a few minutes it shows the correct image. I have tried many solutions available in stackoverflow. But i didnt get a solution. Please help me.
答案 0 :(得分:4)
就像其他人最有可能说的那样,因为你正在将可重复使用的单元格(正如你应该)出列并将cell.imageView.image属性设置为你的网络图像。
这里的问题是因为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;
}
请注意sd_setImageWithURL
来自SDWebImage库,我想其他人在这里提到过。 https://cocoapods.org/pods/SDWebImage
答案 1 :(得分:1)
这是因为重复使用细胞。尝试重置单元类prepareForReuse方法中的图像
-(void)prepareForReuse {
[super prepareForReuse];
self.imageView.image = nil;
}
答案 2 :(得分:1)
您遇到的问题是由于重用UITableViewCell。 如果您使用AlamofireImage或SDWebImage从网络服务下载图片。它会处理你的问题。
答案 3 :(得分:0)
UICollectionView
重复使用相同的UICollectionViewCell
来提高效果。只有UICollectionViewCell
内的数据发生了更改,因此在使用UICollectionViewCell
之前,必须清除UICollectionViewCell
之前的数据。 Cocoa Framework
提供了UICollectionViewCell
中存在的方法,该方法每次重复使用UICollectionViewCell
时都会触发。
只需覆盖自定义UICollectionViewCell
类文件<。p>的.m文件中的下面给出的函数
-(void)prepareForReuse {
[super prepareForReuse];
// here we clear the previously set data
self.imageView.image = nil; // this will clear the previously set imageView is a property of UIImageView used to display a image data
}
答案 4 :(得分:0)
您可以使用prepareForReuse()
方法来处理此问题。
override func prepareForReuse() {
super.prepareForReuse()
// still visible on screen (window's view hierarchy)
if self.window != nil { return }
imageView.image = nil
}
注意:如果您使用的是SDWebImage,则应添加此行以取消当前的单元格图像下载。
imageView.sd_cancelCurrentAnimationImagesLoad()