繁体   English   中英

在UICollectionView中将两个部分放在一起

[英]Placing two sections next to each other in a UICollectionView

我有一个包含6个部分的CollectionView

第一部分按组织。 第2和第3节是事情变得困难的地方。 我需要将两个部分放在一起

[................第1节..............] //一节有两排
[......第2节......] [...第3节......] //第一节下方的两个部分

我不能将第二部分分成两列,因为它们不同,填充了不同的单元格。
知道流布局总是填充从边界到边界的一个部分,我只能通过将两个单元格放在一起来伪造这样的效果,这很好,但是我添加了单元格,我只能用一个整数放在另一个下面每当我在cellForItemAtIndexPath中创建一个新单元格时,它会递增,并使用它乘以单元格的高度。

我面临的唯一问题是当我重用一些单元格时,整数变量hack不再起作用。

那么除了自定义布局之外,还有更好的方法可以将两个部分放在一起吗?

提前致谢

您不一定要编写自定义布局,实际上您只需子类化UICollectionViewFlowLayout并覆盖一些确定帧定位的关键方法,即layoutAttributesForElementsInRect: / layoutAttributesForItemAtIndexPath:您可以在其中检查该部分并确定位置。

代码本身可能相对简单,类似于:

if indexPath.section == 0 {
    attributes.frame = CGRect(x: 0, y: 0, width: fullWidth, height: someHeight)
} else {
    // Section 2 which is indexed at 1, set the frame
    // to half the width and x to 0
    if indexPath.section %2 != 0 {
        attributes.frame = CGRect(x: 0, y: someYCounter, width: halfWidth, height, someHeight)
    } else {
        attributes.frame = CGRect(x: halfWidth, y: someYCounter, width: halfWidth, height, someHeight)
    }
}

显然这是伪代码,我没有通过编译器运行它,但基本步骤是:

  • 有一个保护语句,确保存在集合视图,以便您可以定义以下变量: halfWidthfullWidth (稍后布局时使用)
  • 保持你的y位置的运行计数器
  • 适当检查部分索引和位置

解决此问题的最佳方法是覆盖prepare并计算布局属性数组(并将其存储为实例变量)。 然后在layoutAttributesForItemAtIndexPath:等中,只返回该数组中索引处的对象(或者如果索引由于某种原因超出范围,则返回super.layoutAttributesForItem(at: indexPath)

这就是UICollectionViewFlowLayout的美妙之UICollectionViewFlowLayout ,大部分繁重的工作都是为你完成的,你可以通过几个简单的方法来获得所需的行为。 替代方案是一个完整的自定义布局,在我看来,除非你有一些疯狂的行为,否则你应该与你的设计师就他们所做的复杂性进行对话。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM