滚动后UICollectionViewCell重叠障碍

时间:2014-09-02 15:36:35

标签: ios objective-c uicollectionview uicollectionviewcell uicollectionviewlayout

这是我的第一个申请。我想像这样实现卡片堆栈。

enter image description here

我为此应用使用UICollectionView。并按minimumLineSpacing =-20.f

创建重叠单元格
UICollectionViewFlowLayout *collectionViewLayout = (UICollectionViewFlowLayout*)self.collectionView.collectionViewLayout;
    collectionViewLayout.sectionInset = UIEdgeInsetsMake(0.f, 0, 0, 0);
    collectionViewLayout.minimumLineSpacing = -20.f;

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
    static NSString *identifier = @"Cell";

    CollectionNewCell *cell = (CollectionNewCell *)[collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath];
    cell.layer.borderWidth=1.0f;
    cell.layer.borderColor=[UIColor blueColor].CGColor;
    cell.layer.cornerRadius=10.0;
    cell.layer.masksToBounds=YES;

    cell.backgroundColor=[UIColor redColor];
    cell.backgroundView.backgroundColor=[UIColor redColor];
    return cell;
}

我发现滚动后,一些单元格与其他单元格重叠(例如:黄线)

enter image description here

我不知道自己错了什么。你有什么建议吗?

谢谢。

2 个答案:

答案 0 :(得分:0)

您需要从单元格中删除所有子视图

 for (UIView *view in cell.contentView.subviews) {
       if ([view isKindOfClass:[UILabel class]]) {
                [view removeFromSuperview];
       }
 }

答案 1 :(得分:0)

我知道,这个问题很老,但是答案很简单。

这里的问题是UICollectionView不知道您要如何精确地深度布置单元格。因此,它仅显示其他视图上方添加到视图层次结构的最后一个单元格。

要解决此问题,您需要设置适当的单元格zIndex。为此,您需要使用自定义UICollectionViewLayout:)

Swift上的解决方案:

class MyCollectionViewFlowLayout: UICollectionViewFlowLayout {
    override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
        return super.layoutAttributesForElements(in: rect)?.map { attributes in
            // Set cell's zIndex = cell's row, so each next cell will always overlap previous cell.
            attributes.zIndex = attributes.indexPath.row
            return attributes
        }
    }
}

如果您不想创建自定义布局,则还有另一种解决方案。只需像这样覆盖单元格的方法apply(_ layoutAttributes: UICollectionViewLayoutAttributes)

class MyCell: UICollectionViewCell {
    ...

    override func apply(_ layoutAttributes: UICollectionViewLayoutAttributes) {
        layer.zPosition = CGFloat(layoutAttributes.indexPath.row)
    }

    ...
}