UICollectionView中只有一些单元格之间的自定义间距

时间:2018-01-20 03:10:00

标签: ios swift uicollectionview

我正在尝试创建一个水平滚动和单行的UICollectionView。可以将单元格动态添加到集合的末尾。我希望行为是当UICollectionView中有一定数量的单元格并且添加了新单元格时,第一个x个单元格将会缩小它们的间距,同时保持相同的大小。理想情况下,我希望第一个x单元格实际上彼此重叠(看起来像一个堆栈)以节省最大空间。 x之后集合中的其余单元格将以它们之间的正常间距显示。

视觉:

( ) ( ) ( ) ( ) ( )正常布局( )是项目

当又添加两个项目时,

会变成这样:

((((( ) ( ) ( )

( ))))) ( ) ( )如果第一个项目位于堆栈的顶部(我现在不介意哪个项目,只是堆栈很重要)

任何人都可以就如何实现这一目标提供任何帮助和建议吗?

2 个答案:

答案 0 :(得分:1)

对于任何有兴趣的人,我通过继承UICollectionViewFlowLayout并覆盖如下来实现了这一点。请记住,我在集合的末尾使用了一个额外的单元格作为addCell按钮,因此这个实现解释了这一点,并且在添加了5个实际项目之后将进行重新排列,然后您将添加第6个。我的单元格宽度为50,正常布局时的最小间距为10

override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
    guard collectionView!.numberOfItems(inSection: 0) > 6 else {
        return super.layoutAttributesForElements(in: rect)
    }

    let layouts = super.layoutAttributesForElements(in: rect)?.map { $0.copy() as! UICollectionViewLayoutAttributes }
    for (index, layout) in layouts!.enumerated() {
        var frame = layout.frame
        frame.origin.x = frame.origin.x - (35.0 * CGFloat(index < 5 ? index : (index - (index - 4))))
        layout.frame = frame
    }

    return layouts
}

答案 1 :(得分:0)

您可以实现任何您喜欢的定位,因为您可以编写UICollectionViewLayout来告诉集合视图如何定位其项目。

默认情况下,流布局不会执行您所描述的操作。它根据集合视图内容宽度和您提供的最小项目间距,简单地列出每行中具有相同间距的所有项目。但是如果您子类 UICollectionViewFlowLayout,您可能修改流布局的行为以执行您所描述的操作。因此,您不需要完全从头开始编写布局对象。

但是,为了获得最大的灵活性,完全从头开始编写布局对象正是您要做的。这真的不是那么难。 Apple有很多例子,当然也有许多教程示例。