如何让 UICollectionView 在不离开屏幕的情况下使用自动布局填充其包含滚动视图的宽度?

Posted

技术标签:

【中文标题】如何让 UICollectionView 在不离开屏幕的情况下使用自动布局填充其包含滚动视图的宽度?【英文标题】:How can I get a UICollectionView to fill the width of its containing scroll view with Auto Layout without going off the screen? 【发布时间】:2013-07-05 20:00:42 【问题描述】:

我的视图层次结构如下所示:

- View
  - Scroll View
    - Collection View

我正在使用自动布局。问题是,当我指定集合视图应占用父视图的全宽时,它实际上最终占用了其中包含的元素的全宽。即,如果此集合视图中有 1000 个元素,并且每个元素的宽度为 10 像素,那么集合视图将为 10000 像素。它似乎忽略了我的限制。

我使用的 VFL 看起来有点像这样:

滚动视图

H:|[scroll]|
V:|[scroll]|

收藏视图

H:|[collection]|
V:|[collection]|

所有视图都设置为不将自动调整大小的掩码转换为约束。

【问题讨论】:

一个 UICollectionView 是一个 UIScrollView。为什么要把它放在另一个 UIScrollView 中? UICollectionView inside of UIScrollView的可能重复 我的问题简化了布局,但基本前提是我在同一个滚动视图中有多个集合视图(具有不同的布局和数据源)。布局在单个集合视图中是不可能的。 您链接到的问题是引用另一个问题,但很好发现。我很难找到与此类似的问题。 @AaronBrager 如果您想查看示例代码,请告诉我 【参考方案1】:

当我指定集合视图应采用全宽时 超级视图,它最终实际上占据了整个宽度 其中包含的元素。

滚动视图的全部意义在于它允许显示比滚动视图本身更大的视图。所以将集合约束到滚动视图是没有意义的——滚动视图的子视图可以像他们想要的一样大。如果您想限制集合视图的大小,只需将其宽度设置为您喜欢的任何宽度即可。

【讨论】:

所以我想这只是我们必须忍受的限制?滚动视图框架无法自动调整大小以剪切其内容视图。真可惜。 :-/【参考方案2】:

您帖子中的约束使集合视图沿两个轴填充滚动视图。目前尚不清楚您为什么要这样做。我假设您实际上想要 App Store 之类的东西,它在垂直滚动的滚动视图中有多个水平滚动的集合。

自动布局对滚动视图有特殊的行为。去阅读Technical Note TN2154: UIScrollView And Autolayout。

因此,滚动视图的边缘和滚动视图的后代之间的约束会影响滚动视图的内容大小。滚动视图的边缘和滚动视图之外的视图之间的约束会影响滚动视图的框架。

您需要将集合视图的左边缘固定到***视图(滚动视图的超级视图)的左边缘,右边缘也类似。你不能用视觉格式来做到这一点。您需要明确创建这些约束(或在您的 xib 或情节提要中设置它们)。

【讨论】:

以上是关于如何让 UICollectionView 在不离开屏幕的情况下使用自动布局填充其包含滚动视图的宽度?的主要内容,如果未能解决你的问题,请参考以下文章

在不使用 reload 方法的情况下调整 UICollectionView 的单元格

如何在不离开当前视图的情况下关闭 modalViewController?

如何在不离开我的网站的情况下接受信用卡付款? [关闭]

UICollectionView 拖放单元格

如何在不离开 php 页面的情况下强制保存另存为对话框?

当单元格即将离开屏幕时,UICollectionView Cell 的阴影突然消失