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

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

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

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

【问题讨论】:

    标签: ios uikit uicollectionview


    【解决方案1】:

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

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

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

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

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

    【讨论】:

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

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

    【讨论】:

    • 这可能是解决方案的一部分,但我无法确定调用可见单元格的好地方。我可以在滚动事件期间执行此操作,但随后我必须跟踪我已经确定可见的单元格......那里有很多复杂性,我认为这是不可行的。
    • 这可能会报告不在屏幕上的单元格。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 2018-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-19
    • 2021-11-26
    相关资源
    最近更新 更多