gpt4 book ai didi

ios - 防止 UICollectionView 中的项目 "wrapping"

转载 作者:可可西里 更新时间:2023-11-01 03:54:24 27 4
gpt4 key购买 nike

我需要一个 UICollectionView 来显示一个在宽度和高度上都可能大于可见框架的网格,同时保持行和列的完整性。默认的 UICollectionViewFlowLayout 允许 sections 滚动到屏幕外,但它将项目包装在一个部分中以将它们全部显示在屏幕上,这搞砸了我的网格。

认识到 UICollectionViewUIScrollView 的子类,我尝试在 viewDidLoad 中手动设置 Collection View 的内容大小属性:

self.collectionView.contentSize = CGSizeMake((columns * (cellWidth + itemSpacingX), (rows * (cellHeight + itemSpacingY));

但这没有任何效果。问题:

  • 有没有一种无需构建自定义布局即可轻松完成此任务的方法?
  • 是否可以使用自定义布局并覆盖 collectionViewContentSize 方法来使 Collection View 停止环绕项目并双向滚动?
  • 如果我确实必须构建一个自定义布局——我将不得不投入一些时间来学习——我是将 UICollectionViewLayout 子类化,还是将 UICollectionViewFlowLayout 子类化省时间?

更新:我尝试将 UICollectionView 嵌入为 UIScrollView 的 subview 。 Collection View 本身的行为是正确的——行没有环绕在 ScrollView 的边缘,告诉我它正在填充我设置的 UIScrollView 内容大小。但是 ScrollView 不会在水平方向上平移,即它只会垂直滚动,而 Collection View 本身就是这样做的。于是又卡住了。响应链可能有问题吗?

最佳答案

想出两种方法来做到这一点。两者都需要自定义布局。问题是默认的流布局——我现在从Collection View Programming Guide知道这是流布局的部分定义——基于父 View 的边界生成单元格布局属性, 并将项目包装在一个部分中以将它们保持在边界内,以便仅在一个轴上发生滚动。将跳过代码细节,因为它并不难,我的问题主要是对采用何种方法感到困惑。

简单方法:使用 UIScrollView 和子类“UICollectionViewFlowLayout”。UICollectionView 嵌入到 UIScrollView 中。在 viewDiDLoad 中设置 ScrollView 的 contentSize 属性以匹配您的 Collection View 将占据的完整大小(这将使默认流布局将项目放置在一个部分的单行中而不换行)。子类 UICollectionViewFlowLayout,并将该对象设置为 Collection View 的自定义布局。在自定义流布局中,覆盖 collectionViewContentSize 以返回 Collection View 矩阵的完整大小。通过这种方法,您将使用流式布局,但将能够在两个方向上滚动以查看未包装的部分。缺点是您的流布局仍然非常有限。另外,将 UICollectionView 放在它自己的父类(super class)的实例中只是为了获得 Collection View 本身应具有的功能似乎很笨拙。

更难,但更通用和优雅的方法:子类 UICollectionViewLayout。我使用了 this tutorial了解如何实现完整的自定义布局。此处不需要 UIScrollView。如果您放弃流布局,继承 UICollectionViewLayout,并将其设置为自定义布局,您可以构建矩阵并从 Collection View 本身获得正确的行为。这是更多的工作,因为您必须生成所有的布局属性,但是您将被定位为使 Collection View 做任何您想做的事情。

在我看来,Apple 应该在默认流布局中添加一个属性来禁止换行。让设备显示具有完整行和列的二维矩阵并不是什么奇特的功能,看起来应该更容易做到。

关于ios - 防止 UICollectionView 中的项目 "wrapping",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21968511/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com