更改布局时 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的主要内容,如果未能解决你的问题,请参考以下文章