【问题标题】:What can I do to stop CollectionView refreshing the cell which was displayed when scrolling?我该怎么做才能停止 CollectionView 刷新滚动时显示的单元格?
【发布时间】:2014-11-15 00:02:23
【问题描述】:

我正在使用 UICollectionView 来显示图像。

这是我的代码:

- (WaterFallCollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    WaterFallCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:collectionViewCellIdentifier forIndexPath:indexPath];
    NSURL *itemTBURL = [NSURL URLWithString:self.items[indexPath.item][@"image"][@"thumbnailLink"]];
    [cell setNeedsLayout];
    cell.imageView.imageURL = itemTBURL;

    return cell;
}

我的问题是,比如collectionView总共有10张图片,首先我向下滚动到最后一张,collectionView中的第一张图片是不可见的,当我向上滚动到第一张时,它有刷新的效果程序将跳转到我展示的方法。看起来当单元格从不可见状态变为可见状态时,iOS 将强制调用该方法。我想存储之前显示的单元格,所以当你向上滚动时,它不会有刷新效果。我应该怎么办?我知道 Twitter、Pinterest、Facebook 当你向上滚动时,它们看起来不会刷新以前的单元格。我知道这是可行的,只是不知道该怎么做。提前致谢。

【问题讨论】:

  • 您需要缓存您正在下载的图像并将它们存储在本地,而不仅仅是在内存中。您看到的“刷新”效果是因为单元格作为重用机制的一部分出列以确保平滑滚动。
  • 嗨,杰夫,感谢 cmets。你能更具体一点吗?我是否需要将单元格对象与图像一起存储在本地?并且在滚动时,检查本地是否有该 indexPath 的单元格对象?如果是这样,使用它,如果不是出列另一个?
  • 您不需要存储单元对象,您只需要缓存图像(例如存储到沙箱中的设备)。然后下次你来检查图像是否在你的缓存中,如果是,使用它,如果不是,下载它。您可能会发现 github.com/rs/SDWebImage 很有用。
  • 同意杰夫。您可以使用 SDWebImage 和 UIImageView 类别来异步加载图像。如果图片已经下载,它会跳过网络操作,直接通过缓存加载。

标签: ios objective-c uicollectionview


【解决方案1】:

什么是“刷新效果”?什么意思?

每次滚动到新的 UICollectionViewCell 时,UICollectionView 都会调用 cellForItemAtIndexPath: 来获取此单元格。 每个细胞都是可重复使用的。因此,您可以在单元格的“- (void) prepareForReuse()”方法中初始化单元格以便进一步重用它。

据我了解,每次设置 imageView.imageURL - 图像开始加载,然后显示它,对吗?我认为,您应该在第一次加载后缓存这些图像。

无论如何,都没有办法跳过调用 cellForItemAtIndexPath。

【讨论】:

  • 因为我使用的是dequeueResusableCellWithIdentifier方法,也就是说,iOS会给出一个之前用过的cell。所以当我向上滚动时,我使用以前使用的单元格并设置图像。看起来您重置了先前具有图像的单元格上的图像。这就是我的意思的刷新效果。
  • 你应该在你的单元格中实现这个方法来防止刷新: - (void) prepareForReuse { self.imageView.image = nil; }
猜你喜欢
  • 2015-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多