我正在尝试创建一个水平滚动和单行的UICollectionView
。可以将单元格动态添加到集合的末尾。我希望行为是当UICollectionView
中有一定数量的单元格并且添加了新单元格时,第一个x
个单元格将会缩小它们的间距,同时保持相同的大小。理想情况下,我希望第一个x
单元格实际上彼此重叠(看起来像一个堆栈)以节省最大空间。 x
之后集合中的其余单元格将以它们之间的正常间距显示。
视觉:
( ) ( ) ( ) ( ) ( )
正常布局( )
是项目
会变成这样:
((((( ) ( ) ( )
或( ))))) ( ) ( )
如果第一个项目位于堆栈的顶部(我现在不介意哪个项目,只是堆栈很重要)
任何人都可以就如何实现这一目标提供任何帮助和建议吗?
答案 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有很多例子,当然也有许多教程示例。