我有两个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转换到布局1之前更改布局2中单元格的zIndex。不优雅,但我认为如果我使用setCollectionViewLayout可能会有效:动画:completion:我调用setCollectionViewLayout:animated:在第一个布局更改的完成块内。
无论如何,我似乎很疯狂,我必须在layoutAttributesForItemAtIndexPath中为相反的布局设置zIndex:以获得更改布局的正确最终结果。有没有人对如何以不需要这种黑客的方式实现这一点有任何建议?
编辑我在从布局2切换到布局1时实现了中间布局。中间布局仅在被翻转的zIndex方面有所不同。有趣的是,要在布局2和这个中间布局之间切换,我不需要在layoutAttributesForItemAtIndexPath中应用hack:但是我确实需要在setCollectionViewLayout的完成块中的collectionView上调用reloadData:animated:completion for it to work。< / p>
仍然想知道为什么zIndex hack是正确切换其他布局所必需的。
答案 0 :(得分:0)
没有详细介绍UICollectionView架构和布局方法,这里有一个概念性的想法:
鉴于可重复使用的单元格回收 - 您是否可以简单地将新内容分配到正确位置的单元格 *?也就是说,确保在一个布局中具有项目0的顶部单元格具有第二个布局中的最后一个项目。也许它涉及扭转顺序,但它似乎比算术重新计算z-index更加明显和复杂。