UICollectionView在两个方向上滚动

时间:2012-11-01 14:55:38

标签: ios scroll uicollectionview uicollectionviewlayout

我用垂直滚动制作了UICollectionView

单元格的宽度超过了屏幕宽度,因此我根据customFlowLayout布局创建了UICollectionViewFlow,返回正确的计算内容大小。

然而,这不起作用。当单元格的宽度小于屏幕宽度时,它可以工作。这是否意味着我们在垂直滚动中宽度不能超过屏幕宽度?

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

有没有办法让它发挥作用?

6 个答案:

答案 0 :(得分:13)

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

当您在故事板中展示视图时,可以将UICollectionView嵌入UIScrollView。将滚动视图设置为水平滚动,UICollectionView设置为垂直滚动。然后将UICollectionView.delaysContentTouches设置为true,以便触摸将传递到UIScrollView,而不会认为您正在尝试滚动集合视图。

当您设置UICollectionView时,将其大小和单元格的大小设置为您实际想要的大小(比实际屏幕更宽)并相应地布置它们。

现在在包含UIViewController中将此代码放入视图生命周期

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

这就是你要完成你所描述的所有事情。现在你的scrollview应该允许你水平滚动来查看你的整个单元格,你的collectionView应该垂直滚动你的单元格。

快乐的节目。

答案 1 :(得分:3)

我发现了这个UICollectionView: How to define a UICollectionViewLayout that supports horizontally and vertically scrolling?

Jirune提供的例子似乎是关键。但是如果可以使用collectionview行而不是行的部分,那就太好了..

答案 2 :(得分:0)

我不确定我是否理解你的问题。

但是如果您已经制作了自定义布局,请确保已实施:

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

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

同时确保您已实施:

- (CGSize) collectionViewContentSize;

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

另外,请确保您的collectionView允许滚动,并使用以下方法正确准备您的布局:

- (void)prepareLayout

顺便说一句,对于您的布局,您是否超载了UICollectionViewLayoutUICollectionViewFlowLayout

答案 3 :(得分:0)

在你能做到这一点之前,你必须使用不同类型的布局。流布局将其项目表示为列表,并根据可用宽度跨单元格中的这些项目。 如果要同时进行水平和垂直滚动,则需要以某种方式指定网格的列数。 FlowLayout没有那个。一个简单的解决方案是创建一个UICollectionViewLayout的子类并覆盖collectionViewContentSize,使其重新调整宽度=一行的单元格宽度的增加总和(这是知道需要多少个列的位置),以及之间的任何额外间距他们。如果您的单元格每列具有相同的大小(类似于网格),则此方法可以正常工作。

答案 4 :(得分:0)

Xcode 11 +,Swift 5。

我解决了问题,准备了videocode

答案 5 :(得分:0)

您应该将UITableView嵌入到UIScrollView中。 ScrollView和TableView的高度相同,但宽度不同。 这样,UITableView将垂直滚动,而UIScrollView将水平滚动。