如何确定何时显示 UICollectionViewCell?

Posted

技术标签:

【中文标题】如何确定何时显示 UICollectionViewCell?【英文标题】:How can I determine when a UICollectionViewCell is displayed? 【发布时间】:2013-06-25 18:24:15 【问题描述】:

我想知道UICollectionViewCell 何时显示在实际屏幕上。 cellForRowAtIndexPath 是不够的,因为此时实际上还没有看到单元格。 didEndDisplayingCell 是不够的,因为它会在单元格从视图中移除时被调用。

UITableViewDelegate 有一个 willDisplayCell 方法,过去我发现它对类似的东西很有用,但它似乎在 UICollectionViewDelegate 中不存在。

如何确定单元格何时显示在屏幕上?

【问题讨论】:

【参考方案1】:

创建UICollectionViewCell 的子类。覆盖其didMoveToWindow 方法:

- (void)didMoveToWindow 
    if (self.window != nil) 
        // I am now in the window's view hierarchy and thus “on screen”.
    

从技术上讲,单元格可能仍然不可见,要么是因为它位于窗口的可见边界之外,要么是因为它被另一个视图覆盖。但通常情况下两者都不会。

还要注意,如果一个单元格被重用,它可能不会从视图层次结构中删除或重新添加到视图层次结构中。集合视图只能更改单元格的框架。 (我知道 UITableViewios 6.0 开始对表格视图单元格执行此操作。)在这种情况下,当单元格被重新用于另一个项目时,您不会收到 didMoveToWindow 消息。

如果您解释为什么您想知道何时显示单元格,我们或许可以为您提供更好的答案。

【讨论】:

首先,我只是在寻找一个分析事件,这样我就可以将单元格的视图与不同的操作进行比较。但我也在考虑一些创意动画,在用户真正看到单元格之前我不想开始。【参考方案2】:

-[UICollectionView visibleCells] 返回屏幕上所有可见单元格的 NSArray

【讨论】:

这可能是解决方案的一部分,但我无法确定调用可见单元格的好地方。我可以在滚动事件期间执行此操作,但随后我必须跟踪我已经确定可见的单元格......那里有很多复杂性,我认为这是不可行的。 这可能会报告不在屏幕上的单元格。

以上是关于如何确定何时显示 UICollectionViewCell?的主要内容,如果未能解决你的问题,请参考以下文章

如何知道 UICollectionView 何时完成布局?

UICollectionView:如何检测滚动何时停止

识别用户何时触碰 UICollectionView 单元格

如何确定何时显示 UICollectionViewCell?

如何确定用户何时复制了文本

SVG 文本路径,确定文本何时超出路径