Question

I am working on a Coverflow style layout for UICollectionView. Its a simple enough concept, and just to make it easier there are about 100 tutorials on the subject. However as anyone doing transforms knows, m34 is the magic number. However, as soon as I set it to get some perspective for my rotations, the views disappear. The only appear when the rotation is near 0.

I suspect this is a bounds/zIndex issue, however after days of monkeying around with zIndexes and clipping adjustments, the cells just refuse to appear. Any help is greatly appreciated.

- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect
{
    NSArray *array = [super layoutAttributesForElementsInRect:rect];

    CGRect visibleRect = (CGRect){self.collectionView.contentOffset, self.collectionView.bounds.size};

    CGFloat maxDistance = visibleRect.size.width / 2.0;
    CGFloat maxRotation = M_PI_2;

    [array enumerateObjectsUsingBlock:^(UICollectionViewLayoutAttributes * attributes, NSUInteger idx, BOOL *stop) {

        CGFloat distanceFromCenter = CGRectGetMidX(visibleRect) - attributes.center.x;

        CGFloat percentageFromCenter = distanceFromCenter / maxDistance;
        percentageFromCenter = MIN(percentageFromCenter, 1.0);
        percentageFromCenter = MAX(percentageFromCenter, -1.0);

        CGFloat angle = percentageFromCenter * maxRotation;

        CATransform3D transform = CATransform3DIdentity;
//        transform.m34 = 1.0 / -800.0;
        transform = CATransform3DRotate(transform, angle, 0.0, 1.0, 0.0);

        attributes.transform3D = transform;
    }];

    return array;
}
Was it helpful?

Solution

So thanks to one @mpospese on Twitter. The problem wasn't with the m34 value itself. It was with a particular feature of UICollectionView.

when frame height exceeds collection view’s height, cells are removed

So in my case I had a UICollectionViewLayout specially designed to grab the height of the UICollectionView and use it for the height of the cells. Problem is, when m34 is factored in that obviously adjusts the frame and therefore exceeds the bounds. Rather than just clipping the cell like most UIView operations would have done pointing directly to the problem, UICollectionView actually automatically removes cells entirely if they so much as brush the outer-bounds.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top