具有自定义布局的 UICollectionView - 无法在情节提要中添加补充视图

Posted

技术标签:

【中文标题】具有自定义布局的 UICollectionView - 无法在情节提要中添加补充视图【英文标题】:UICollectionView with custom layout - unable to add supplementary view in storyboard 【发布时间】:2013-05-25 22:04:26 【问题描述】:

来自Collection View Programming Guide for ios


注册您的单元格和补充视图

您可以通过编程方式或在应用的故事板文件中配置集合视图的单元格和视图。

在情节提要中配置单元格和视图:

在情节提要中配置单元格和补充视图时,您可以通过将项目拖到集合视图上并在那里进行配置来实现。这会在集合视图和相应的单元格或视图之间创建关系。

对于单元格,将集合视图单元格从对象库中拖放到您的集合视图中。将单元格的自定义类和集合可重用视图标识符设置为适当的值。 对于补充视图,从对象库中拖动一个 Collection Reusable View 并将其放到您的集合视图中。将视图的自定义类和集合可重用视图标识符设置为适当的值。

只要布局设置为自定义而不是流,我就无法设法将集合可重用视图拖放到故事板中的集合视图中。如果我在布局设置为流动时放下一个,一旦我将布局设置回自定义,它就会消失。

如果我将它放在集合视图之外,作为***对象,它不会在运行时使用,即使类和标识符都设置正确。相反,我收到一条错误消息,告诉我必须注册补充视图。如果我手动注册它,它想使用我在情节提要中的视觉设计。

关于这个如何工作有什么建议吗?

【问题讨论】:

我发现与您尝试在具有自定义布局的情节提要中添加 CollectionViewReusableView 的情况相同。您是否尝试过在 xib 文件中创建视图并注册 nib? 不。我只是将其全部替换为代码。 【参考方案1】:

只有当您的布局是 UICollectionViewFlowLayout 的子类时,您才能执行此操作。

    不要在情节提要中指定自定义布局。 选择流程布局并设计补充视图。 然后在您的视图控制器中以编程方式创建并分配您的新布局 对象到 collectionview。 在布局对象上调用 InvalidateLayout 将您在故事板中设计的补充视图与您的自定义布局结合使用

这对我有用。希望它对其他人也有帮助!

【讨论】:

这似乎是解决问题的最简单方法。为我工作! 如果您的自定义布局是 UICollectionViewFlowLayout 的子类,请打开故事板编辑器并在 Collection View 对象下的左侧对象列表中选择流布局(黄色立方体)。然后在“Identity Inspector”中选择你的后代类。就是这样。无需更改代码。 @adnako 感谢您的评论。这使我免于删除我相当复杂的流布局子类。大声笑!【参考方案2】:

您无法使用自定义布局将补充视图添加到情节提要。补充视图由布局对象管理。只有layout知道它的位置,number..没有必要通过layout对象来实现补充视图。这是布局对象的关注点。 UICollectionViewFlowLayout 提供补充视图(节页眉/页脚)。所以你可以在故事板中设计它。如果您使用自定义布局,情节提要如何知道它是否支持补充视图。所以它会把这份工作交给你。 您必须为补充视图注册类/nib

【讨论】:

我不同意这个推理。 registerClass:forSupplementaryViewOfKind:withReuseIdentifier: 方法属于UICollectionView,而不是UICollectionViewLayout。 collectionview 对布局支持与否的补充视图一无所知,而 kind-spesifier 只是一个字符串,因此您可以为布局一无所知的补充视图注册类。那么为什么你不能在故事板中做同样的事情呢?添加UICollectionReusableView 并指定其种类? 注册该类的唯一原因是如果没有要出列的视图,collectionview 能够为您创建视图。这与注册是可选的UITableView 形成对比。当你说'补充视图由布局对象提供'时 - 它是错误的。布局不会提供任何视图。它只会告诉视图应该在哪里。这完全取决于UICollectionView 和它的UICollectionViewDataSource 协议来提供视图。 在情节提要中注册可重用视图不是问题。故事板如何知道您的自定义布局支持补充视图?如果它支持在哪里放置它?那么有多少补充意见呢? 如果您选择流式布局,则位置和数量是固定的。您可以进行相应的设计。 文档与断言相矛盾。我想说这是故事板设计器中的一个明显错误。是的,布局管理器控制元素的布局,但是我想直观地设计这些元素的很多功能。文档表明您可以拖放集合可重用视图,但在自定义布局中不能,在流布局中您只能拖放两个,即页眉和页脚。【参考方案3】:

当前最佳答案中的这条评论似乎是最好的解决方案。

如果您的自定义布局是 UICollectionViewFlowLayout 的子类,请打开故事板编辑器并在 Collection View 对象下的左侧对象列表中选择流布局(黄色立方体)。然后在“Identity Inspector”中选择你的后代类。就是这样。无需更改代码

-阿德纳科

【讨论】:

以上是关于具有自定义布局的 UICollectionView - 无法在情节提要中添加补充视图的主要内容,如果未能解决你的问题,请参考以下文章

具有自定义布局的 UICollectionView - 无法在情节提要中添加补充视图

自定义UICollectionView布局

UICollectionView 自定义布局单元格类型相关属性

如何 UICollectionView 每列具有不同的行

iOS UICollectionView自定义流水布局(一)

UICollectionView 中的自定义布局