【问题标题】:detecting when an iOS UICollectionCell is going off screen检测 iOS UICollectionCell 何时离开屏幕
【发布时间】:2013-08-27 12:30:10
【问题描述】:

我有一个UICollectionView,它将图片作为元素保存在其数据存储中。

我只想在元素对应的UICollectionViewCell 当前显示在屏幕上时才将高分辨率图片加载到元素中。后来,当UICollectionViewCell 离开屏幕时,我想将元素的UIImage 返回到低分辨率版本。

我的问题是,我如何检测UICollectionViewCell 何时离开屏幕?

(我尝试使用prepareForReuse 方法,但我无法预测它何时会被调用)。

我目前正在使用位于scrollViewDidScroll 中的一段代码,每次视图滚动时,我都会检查self.collectionView.visibleCells 以查看哪些单元格已滚动到屏幕外。

这似乎有点开销,我想知道UICollectionViewCell 本身在滚动屏幕时是否调用了一个方法?

【问题讨论】:

    标签: ios uicollectionview uicollectionviewcell uicollectionreusableview


    【解决方案1】:

    UICollectionViewDelegate 上的 collectionView:didEndDisplayingCell:forItemAtIndexPath: 方法应该可以满足您的需求。

    【讨论】:

    • 正是我想要的!谢谢
    • 非常感谢 :) 这就是我要找的东西 :)
    • 这个方法唯一的问题是当'collectionView`收到reloadData消息时它也会被调用
    • @Mazyod 是的,有时屏幕上的某些单元格会传递给collectionView:didEndDisplayingCell:forItemAtIndexPath:
    • 您可以输入guard !collectionView.indexPathsForVisibleItems.contains(indexPath) else { return }。它不是那么优雅,但它会起作用。
    【解决方案2】:

    来自文档。 collectionView:didEndDisplayingCell 在完成显示后立即调用,而不是在它离开屏幕时调用

    使用此方法检测单元格何时从集合视图中移除,而不是监视视图本身以查看它何时消失

    【讨论】:

      【解决方案3】:

      collectionView:didEndDisplayingCell:forItemAtIndexPath: 是检测单元格何时离开屏幕的正确方法。

      同时,我认为collectionView:didEndDisplayingCell:forItemAtIndexPath: 中执行清理而是告诉您的单元自己执行清理更正确:

        func collectionView(_ collectionView: UICollectionView,
                       didEndDisplaying cell: UICollectionViewCell,
                         forItemAt indexPath: IndexPath) {
          cell.prepareForReuse()
        }
      

      通过这种方法,您的UICollectionViewDelegate 不必知道您的UICollectionViewCell 子类的任何实现细节。在单元格中,我们将覆盖 prepareForReuse 方法:

       override func prepareForReuse() {
          super.prepareForReuse()
      
          imageView.image = lowResolutionImage
          highResolutionImage = nil
       }
      

      【讨论】:

      • prepareForReuse() 在使用 dequeueReusableCell(...) 将单元格出列之前由框架调用。我认为,在您的情况下,您可以在重用之前进行清理,但这会保持分配的内存,直到必须重用单元格。如果您想解决内存问题,正确的解决方案是在单元格结束显示时释放内存。
      猜你喜欢
      • 2010-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-07
      • 2012-12-20
      • 2020-12-11
      • 1970-01-01
      相关资源
      最近更新 更多