更改布局时 UICollectionViewLayout 不更新 zIndex

Posted

技术标签:

【中文标题】更改布局时 UICollectionViewLayout 不更新 zIndex【英文标题】:UICollectionViewLayout doesn't update zIndex when changing layouts 【发布时间】:2013-08-09 21:55:23 【问题描述】:

我有两个 UICollectionViewLayouts 在单独使用时可以正常工作,但是在使用 setCollectionViewLayout:animated 在两个布局之间切换时:动画布局的 zIndex 不使用自己的 zIndex 值,而是使用 zIndex 值原始布局。

以下是这两种布局各自的样子:

在布局 1 中,单元格与项目 0 堆叠在一起。

在布局 2 中,单元格与底部的项目 0 堆叠在一起。

在布局 1 中,我将 zIndex 设置为:

[attributes setZIndex:100 - [indexPath item]];

在布局 2 中,我将 zIndex 设置为:

[attributes setZIndex:100 + [indexPath item]];

如果我从布局 1 开始并更改为布局 2,我最终会得到:

如果我从布局 2 开始并更改为布局 1,我会得到这样的结果:

我已经尝试在 layoutAttributesForElementsInRect: 和 layoutAttributesForItemAtIndexPath: 中设置 zIndex,我发现当切换布局时,layoutAttributesForElelmentsInRect: 在被动画化到的布局上被调用一次,而 layoutAttributesForItemAtIndexPath: 被调用多次随着动画过渡的发生,在两种布局上都发生了变化。

我还注意到对 layoutAttributesForItemAtIndexPath: 的调用是在被动画化的布局上调用之后被调用的。这导致我尝试了一些奇怪的事情,即在 layoutAttributesForElementsInRect: 中为给定布局设置正确的 zIndex,但在 layoutAttributesForItemAtIndexPath: 中为其他布局设置 zIndex。这实际上会导致动画在任一方向完成后的正确布局,但从布局 2 到布局 1 的动画看起来很糟糕,因为 zIndex 直到动画结束才更新。

这是从布局 2 到布局 1 的动画完成(并更正 zIndex)之前的样子:

为了处理在状态之间看到这个问题,我正在考虑制作一个中间布局,它只会在布局 2 中的单元格的 zIndex 转换到布局 1 之前更改它。不优雅,但我认为如果我使用 setCollectionViewLayout:animated 可能会起作用:completion: 我在第一个布局更改的完成块内调用 setCollectionViewLayout:animated:。

无论如何,我必须在 layoutAttributesForItemAtIndexPath: 中为相反的布局设置 zIndex 才能获得更改布局的正确最终结果,这对我来说似乎很疯狂。有没有人对如何以不需要这种 hack 的方式实现这一点有任何建议?

编辑 我在从布局 2 切换到布局 1 时实现了中间布局。中间布局仅在 zIndex 被翻转方面有所不同。有趣的是,要在布局 2 和中间布局之间切换,我不需要在 layoutAttributesForItemAtIndexPath: 中应用 hack:但是我确实需要在 setCollectionViewLayout:animated:completion 的完成块中调用 collectionView 上的 reloadData 以使其工作。

仍然很想知道为什么 zIndex hack 是正确切换其他布局所必需的。

【问题讨论】:

另外,发现了另一个对我的目的完全无用的黑客,除了美学但值得分享:***.com/questions/12659301/… 【参考方案1】:

不深入UICollectionView架构和布局方法的任何细节,这里是一个概念性的想法:

鉴于可重复使用的单元格回收 - 您能否不简单地将新内容分配给 正确位置的单元格*?也就是说,您确保在一个布局中具有项目 0 的顶部单元格在第二个布局中具有最后一个项目。也许它涉及颠倒顺序,但它似乎比用算术重新计算 z-index 更明显,也更简单。

【讨论】:

以上是关于更改布局时 UICollectionViewLayout 不更新 zIndex的主要内容,如果未能解决你的问题,请参考以下文章

如何在运行时更改布局?

Android XML:设备更改时布局行更改

按钮单击小部件时更改布局

更改布局时 UICollectionViewLayout 不更新 zIndex

发生布局更改时动画

单击按钮时更改布局背景颜色