在屏幕上查看可见但 didMoveToWindow: etc 从不调用

Posted

技术标签:

【中文标题】在屏幕上查看可见但 didMoveToWindow: etc 从不调用【英文标题】:View Visible on Screen but didMoveToWindow: etc Never Called 【发布时间】:2017-05-20 05:03:23 【问题描述】:

我正在使用didMoveToWindow: 来触发带有自定义 UICollectionViewCell 的动画。奇怪的是...对于第一个和第二个单元格,动画效果很好(并且所有应该调用的方法都被调用)...

...对于第 3 个单元格,它会显示出来,但不会为第 3 个单元格调用 didMoveToWindow:willMoveToWindow:didMoveToSuperview:willMoveToSuperview:。我什至尝试过drawRect:,但它也从未被调用...

我不明白如何在不调用 drawRect: 的情况下在屏幕上绘制它。

drawRect:我只是打印到日志,然后调用super实现。即使从未调用/打印日志消息,这样做确实会使背景变黑(通常它是透明的)。所以那一定是……做了什么……?

每个单元格出现在该位置周围,然后被移动到位。背景表示 UICollectionView 的框架.. 显示一切都在边界内。

更新: 我尝试使用didAddSubview:,但同样的事情......它只在前两个单元格中调用过。但是,当插入第 3 个单元格并重新加载第 2 个单元格并为第 2 个单元格调用 didAddSubview: 时...集合视图的可见单元格计数为 3。

更新2: 当我通过 Xcode 检查视图层次结构时,它会将所有 3 个单元格显示为集合的子视图......但不知何故,它只为前两个调用 addSubview: didAddSubview:.. 奇怪

【问题讨论】:

tableviewcell 可以重复使用,如果它已经显示 didMoveToWindow:willMoveToWindow 将不会被调用,因为它已经被添加了。 对不起,我应该添加。我看着它创建了第三个对象。 initWithFrame: 在第三个单元格上,cellForItemAtIndexPath: 在集合上。还有就是屏幕上同时有 3 个单元格,至少要有 3 个单元格。 是的,我也错过了...所有 3 个单元格都在屏幕上.. 也许您可以尝试将动画代码放在 cellForRow where (cell==nil) 中? @GeneCode 我正在考虑在cellForItemAtIndexPath: 之后启动一个计时器,并轮询可见的单元格计数,然后当它添加到该数组时...启动动画(因为我无法观察到该计数以任何方式)。 【参考方案1】:

这几天忙于其他工作,昨晚又回到这个问题......神奇地这个错误消失了! (在我做了一些意外的重构之后)。

在我执行“performBatchUpdates:”之前,我 1) 重新加载了前一个单元格,2) 插入了新单元格。当我这样做时,从未在插入的单元格上调用视图生命周期事件(从第 3 个单元格开始)。

当我切换到手动重新加载前一个单元格的视图时(只是更改掩码视图,所以没有理由正式重新加载单元格),通过使用“cellForItemAtIndexPath:”捕获它,并且只在执行批量更新中执行插入...我现在收到插入单元格的所有正确视图生命周期事件。

所以错误就在那里。

【讨论】:

以上是关于在屏幕上查看可见但 didMoveToWindow: etc 从不调用的主要内容,如果未能解决你的问题,请参考以下文章

didMoveToWindow:如何调用这个方法?

iOS 我的 UIView 在屏幕上可见吗?

Flutter:检测任何在屏幕上不可见但在小部件树中的小部件的重建

ag-Grid:尝试调用 sizeColumnsToFit() 但网格以零宽度返回,也许网格在屏幕上还不可见?

C#找出控件是不是显示在屏幕上[重复]

第一个屏幕上不可见的单元格不可点击