检测 iOS UICollectionCell 何时离开屏幕
Posted
技术标签:
【中文标题】检测 iOS UICollectionCell 何时离开屏幕【英文标题】:detecting when an iOS UICollectionCell is going off screen 【发布时间】:2013-08-27 12:30:10 【问题描述】:我有一个UICollectionView
,它将图片作为元素保存在其数据存储中。
我只想在元素对应的UICollectionViewCell
当前显示在屏幕上时才将高分辨率图片加载到元素中。后来,当UICollectionViewCell
离开屏幕时,我想将元素的UIImage
返回到低分辨率版本。
我的问题是,我如何检测UICollectionViewCell
何时离开屏幕?
(我尝试使用prepareForReuse
方法,但我无法预测它何时会被调用)。
我目前正在使用位于scrollViewDidScroll
中的一段代码,每次视图滚动时,我都会检查self.collectionView.visibleCells
以查看哪些单元格已滚动到屏幕外。
这似乎有点开销,我想知道UICollectionViewCell
本身在滚动屏幕时是否调用了一个方法?
【问题讨论】:
【参考方案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(...) 将单元格出列之前由框架调用。我认为,在您的情况下,您可以在重用之前进行清理,但这会保持分配的内存,直到必须重用单元格。如果您想解决内存问题,正确的解决方案是在单元格结束显示时释放内存。以上是关于检测 iOS UICollectionCell 何时离开屏幕的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Swift 检测 iOS 应用程序何时出现在前台? [复制]
通过单击 UICollectionCell 上的按钮执行 segue
更改自定义 UICollectionCell 中标签的边框宽度
如何停止使用渐变 UICollectionCell 创建新图层?覆盖 func prepareForReuse()
带有 UICollectionViewDelegateFlowLayout 的 UIcollectioncell 在添加约束后不应用高度和宽度