UICollectionViewFlowLayout子类transform.m34导致消失的单元格

时间:2013-07-18 01:03:01

标签: uicollectionview coverflow catransform3d uicollectionviewlayout

我正在研究UICollectionView的Coverflow样式布局。它是一个简单的概念,只是为了使它更容易,有大约100个关于这个主题的教程。然而,任何进行变换的人都知道,m34是神奇的数字。但是,只要我设置它以获得旋转的一些视角,视图就会消失。仅在旋转接近0时出现。

我怀疑这是一个边界/ zIndex问题,但是经过几天的zIndexes和裁剪调整后,单元格只是拒绝出现。任何帮助非常赞赏。

- (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;
}

1 个答案:

答案 0 :(得分:3)

感谢Twitter上的一个@mpospese。问题不在于m34值本身。它具有UICollectionView的特定功能。

  

当帧高超过集合视图的高度时,单元格将被删除

所以在我的情况下,我有UICollectionViewLayout专门用来抓住height的{​​{1}}并将其用于细胞的高度。问题是,当考虑UICollectionView时,显然会调整框架并因此超出界限。而不是像大多数m34操作一样剪切单元格而是直接指向问题,UIView实际上会自动删除单元格,如果它们刷到外边界那么多。