UICollectionView在两个方向上滚动

我做了一个垂直滚动的UICollectionView

单元格的宽度大于屏幕宽度,所以我创build了一个基于UICollectionViewFlow布局的UICollectionViewFlow返回正确的计算内容大小。

但是,这是行不通的。 当单元格的宽度小于其工作的屏幕宽度时。 这是否意味着我们在垂直滚动中的宽度不能超过屏幕宽度?

水平滚动是相同的,但是CollectionView的高度仅限于屏幕高度。

有什么办法可以使它工作吗?

正如其他人已经说过, UICollectionView只能使用stream布局来滚动一个方向。 但是,您可以非常轻松地完成此操作,而无需创build自定义布局或使用第三方库。

当你在故事板上放置你的视图时,你可以把你的UICollectionViewembedded到一个UIScrollView 。 将scrollview设置为水平滚动,并使UICollectionView垂直滚动。 然后将UICollectionView设置为“延迟内容接触”,以便它们将传递给UIScrollView而不是认为您正在尝试滚动collectionview。

当你设置UICollectionView ,把它的大小和单元格的大小设置为你想要的(比实际的屏幕宽),然后相应地放置它们。

现在在包含UIViewController把这个代码放在视图生命周期中

  - (void)viewDidLayoutSubviews { self.myScrollView.contentSize = self.myCollectionView.frame.size; } 

这实际上就是你所要做的一切来完成你所描述的内容。 现在你的滚动视图应该允许你水平滚动查看你的整个单元格,你的collectionView应该垂直滚动你的单元格。

开心编程。

我发现这个UICollectionView:如何定义支持水平和垂直滚动的UICollectionViewLayout?

Jirune提供的例子似乎是关键。 但是,如果有可能使用collectionview行而不是行的部分,这将是很好的..

我最近不得不重新访问它。 我在这里创build了一个演示项目: https : //github.com/izotx/ScrollableCollectionView

它使用embedded在滚动视图中的集合视图以两种方式滚动内容。 希望你会发现它有用。

我不确定我了解你的问题。

但是如果你做了一个自定义的布局,确保你已经实现了:

 - (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath; 

并且您的布局属性框架和大小设置为“大单元”索引path的正确值。

还要确保你已经实现了:

 - (CGSize) collectionViewContentSize; 

此方法返回集合View的contentSize。 如果contentSize.width> youAppFrame.width你应该有水平滚动。 同样的高度和垂直滚动。

还要确保你的collectionView允许滚动,并且你的布局是使用以下方法准备的:

 - (void)prepareLayout 

顺便说一句,你的布局是否重载了UICollectionViewLayout或者UICollectionViewFlowLayout

在你这样做之前,你必须使用不同types的布局。 stream程布局将其项目表示为列表,并且它基于可用宽度跨越单元格中的这些项目。 如果你想同时进行水平和垂直滚动,你需要以某种方式指定网格的列数。 FlowLayout没有。 一个简单的方法就是创build一个UICollectionViewLayout的子类,并覆盖collectionViewContentSize,使其重新调整width =一行的单元格宽度的总和(这就是知道需要多less个collumns的情况),再加上他们。 这将工作正常,如果您的单元格具有相同的大小每列,类似于网格。