Search code examples
iosuikituicollectionviewuicollectionviewcell

UICollectionView not obeying zIndex of UICollectionViewLayoutAttributes


The effect I'm trying to achieve is a kind of sticky header cell. It's important to me that the sticky cell floats over the top of the others. Something a bit like this:

┌──────────┐ 
│          │ 
│  Cell 0  │ 
│          ├┐
└┬─────────┘│
 │  Cell 4  │
 │          │
 └──────────┘
 ┌──────────┐
 │          │
 │  Cell 5  │
 │          │
 └──────────┘
 ┌──────────┐
 │          │
 │  Cell 6  │
 │          │
 └──────────┘

Cell 4, 5 and 6 would normally viewable and I'm constructing the attributes for cell 0 in my UICollectionViewFlowLayout subclass during layoutAttributesForElementsInRect:. All I do is call the super implementation, determine which cell I need to add in and then construct the UICollectionViewLayoutAttributes(forCellWithIndexPath:). I then set the zIndex for it to 1 (default is 0).

The problem I'm getting is that the UICollectionView seems to always ignore the zIndex

┌──────────┐ 
│          │ 
│  Cell 0  │ 
│┌─────────┴┐
└┤          │
 │  Cell 4  │
 │          │
 └──────────┘
 ┌──────────┐
 │          │
 │  Cell 5  │
 │          │
 └──────────┘
 ┌──────────┐
 │          │
 │  Cell 6  │
 │          │
 └──────────┘

Now I believe it's possible to visually sort this out using a 3d transform, but that doesn't work for me as I don't want any taps going to the cell which is over the top. So in this example I don't want Cell 4 receiving taps intended for Cell 0.

Does anyone have any ideas? This is on iOS 8.4.


Solution

  • I made a standalone project in order to strip out all my extraneous code. In the process I think I found my own solution.

    override func initialLayoutAttributesForAppearingItemAtIndexPath(itemIndexPath: NSIndexPath) -> UICollectionViewLayoutAttributes?
    and
    override func finalLayoutAttributesForDisappearingItemAtIndexPath(itemIndexPath: NSIndexPath) -> UICollectionViewLayoutAttributes?

    were not also applying the new zIndex so I think this was what was causing it.

    Just thought I should post back the solution in case this comes up in a search for anyone else.