【问题标题】:Placing two sections next to each other in a UICollectionView在 UICollectionView 中将两个部分并排放置
【发布时间】:2018-01-24 18:09:48
【问题描述】:

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

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

[................Section 1........] // 一个有几行的部分
[... Section 2...][...Section 3...] // 第一个下面的两个部分

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

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

除了自定义布局之外,是否还有更好的方法可以将两个部分彼此相邻放置?

提前致谢

【问题讨论】:

标签: ios objective-c uicollectionview


【解决方案1】:

你不一定要写一个自定义布局,你实际上可以只继承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 的美妙之处,大部分繁重的工作都是为您完成的,您可以继承一些简单的方法来获得所需的行为。另一种方法是完全成熟的自定义布局,在我看来,除非你有一些疯狂的行为,否则你应该与你的设计师就他们所做的复杂性进行对话。

【讨论】:

  • 感谢您的评论。这似乎是一种更简单的方法,只需要更改布局,这将大大减少 cellForItemAtIndexPath: 实现以及整体 viewController 实现,并且不需要我实现自定义布局,这是这个问题的重点,因此我接受了答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 2013-05-09
  • 1970-01-01
相关资源
最近更新 更多