I've noticed that when calling setLayout:animated
in a UICollectionView
to switch between two layouts, the currently visible cell doesn't adhere to the zIndex
it's layout attributes has been set in layoutAttributesForItemAtIndexPath:
.
For example, if I were to have a UICollectionView
with UICollectionViewFlowLayout
, set it's minimumLineSpacing
to a negative number so the cells overlap and then set a zIndex
on each cell higher than that of the previous cell, then it appears as if the cells are stacked from the bottom up.
However this breaks if I set the layout to another layout then back to that original layout. It's as if the currently visible cell doesn't listen the zIndex and is placed atop the other cells. If I scroll the cell offscreen then back on it is in the correct place.
Using @sampage & @grimfrog answers as a starting point, I was able to get a similar situation working
My
layoutAttributesForElementsInRect:
callslayoutAttributesForItemAtIndexPath:
when generating the attribute array - so I only needed to include the zIndex and transform3D there.I've managed to get the behaviour I'm after by using a combination grimfrog and Charlie Elliott's responses.
Charlie Elliott's solution got the correct final outcome for the items in the collection view but there was still a snapping effect on the zIndex during the animation.
grimfrog's solution provided the correct look but had the problem of the zIndex still being incorrect after the layout change, despite looking correct.
The combination of the two, while not a great solution, does work and does use the supported transform and zIndex properties of the UICollectionViewLayoutAttributes
In my layout, I have
I won't make this as the correct answer just yet as I'm sure there must be another way to solve this, but I'm interested to see if this solves the problem for others as well.
Try setting the z-index in:
I got another workaround. Since all the cells belong to the same superview, calling
bringSubviewToFront :
when cell displaying works. Specifically, by looking into Debug View Hierarchy, though UICollectionViewLayout not renders cells according to zIndex, it still shows cells according to the reverse order that each subview being added to it's super view.Try:
This bit me too. After several tests I realized that
UICollectionView
will force selected cells to be on top, regardless of the z-index.