Ios 带换行但不滚动的UIView的水平列表

Ios 带换行但不滚动的UIView的水平列表,ios,swift,uicollectionview,Ios,Swift,Uicollectionview,我想一个接一个地水平显示UIView列表,如果行上没有足够的空间,我希望它们换行 案例1:线路上有足够的空间 | [VIEW1] [VIEW2] [VIEW3] | | [VIEW1] [VIEW2] | | [VIEW3 IS TOO LONG SO IT WRAP] | 案例2:线路上没有足够的空间 | [VIEW1] [VIEW2] [VIEW3] | | [VIEW1] [VIEW2]

我想一个接一个地水平显示UIView列表,如果行上没有足够的空间,我希望它们换行

案例1:线路上有足够的空间

| [VIEW1] [VIEW2] [VIEW3]         |
| [VIEW1] [VIEW2]                 |
| [VIEW3 IS TOO LONG SO IT WRAP]  |
案例2:线路上没有足够的空间

| [VIEW1] [VIEW2] [VIEW3]         |
| [VIEW1] [VIEW2]                 |
| [VIEW3 IS TOO LONG SO IT WRAP]  |
这正是UICollectionView+flowLayout所做的,但我不想要任何滚动。我的问题可能是“如何禁用滚动并显示UICollectionView的所有内容?”

谢谢


注意:当然,视图的数量是动态的,所有这些视图都有不同的宽度。

集合视图上添加一个明确的高度约束,并将其高度设置为:

self.collectionViewHeightConstraint.constant = self.collectionView.contentSize.height
重新加载集合视图后(您希望已计算
contentSize

由于
collectionView
与其内容一样高,因此不需要滚动


当然,您希望正确地约束集合视图的左侧和右侧。

UICollectionView
继承自
UIScrollView
,因此您可以修改
collectionView.contentSize
使其小于宽度(或高度,取决于您不希望滚动的方式)它的父视图,并且不会滚动。

听起来不错,但是contentSize.height在我的测试中太小了。我猜,由于集合在开始时没有高度限制,他没有试图向数据源请求内容,因此没有增加其内容高度?@Neekobus好吧,您可以通过在开始时将高度限制设置为某个常量值,调用setNeedsLayout、layoutIfNeeded,然后重新加载数据来检验您的假设,然后再次设置NeedsLayout、LayoutIfNeed,然后检查contentSize。。在这之后,它必须被正确计算。这就是我所做的。在加载数据之前设置常量(大)约束,并在完成工作后使用实际contentSize更新常量。唯一的缺点是在加载数据时可以看到第一个大小。对此进行研究。@Neekobus另一种方法(更一致)可能是为集合视图实现内部内容大小,但这需要更多的代码在“重新加载”之后更新大小约束并不总是好的(可能太早)。因此,我在collectionView的“contentSize”上使用一个观察者,等待最终大小调整我的约束!现在它开始工作了。谢谢