UICollectionView在两个方向上滚动

las*_*mer 20 scroll ios uicollectionview uicollectionviewlayout

我做了UICollectionView一个垂直滚动.

单元格的宽度大于屏幕宽度,因此我创建了一个customFlowLayout基于UICollectionViewFlow布局的方法,返回正确的计算内容大小.

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

水平滚动也是一样,但是高度CollectionView限制在屏幕高度.

有没有办法使它工作?

joh*_*chd 14

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

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

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

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

    - (void)viewDidLayoutSubviews {
        self.myScrollView.contentSize = self.myCollectionView.frame.size;
    }
Run Code Online (Sandbox Code Playgroud)

这就是你要完成你所描述的所有事情.现在,您的滚动视图应该允许您水平滚动以查看整个单元格,并且您的collectionView应该在您的单元格中垂直滚动.

快乐的编程.

  • 这对我有用,但要注意:这种布局会强制CollectionView同时生成所有单元格,因此这种解决方案对于大量单元格来说是不切实际的.我最终需要找到一个不同的解决方案(http://stackoverflow.com/q/15549233/1418688),因为我的CollectionView非常大. (9认同)

小智 0

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

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

- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath;
Run Code Online (Sandbox Code Playgroud)

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

还要确保您已实施:

- (CGSize) collectionViewContentSize;
Run Code Online (Sandbox Code Playgroud)

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

还要确保您的 collectionView 允许滚动并且您的布局已正确准备,使用:

- (void)prepareLayout
Run Code Online (Sandbox Code Playgroud)

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