22

我用UICollectionView垂直卷轴做了一个。

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

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

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

有什么办法让它工作吗?

4

5 回答 5

15

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

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

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

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

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

从字面上看,这就是完成您所描述的内容所需要做的一切。现在,您的滚动视图应该允许您水平滚动以查看整个单元格,并且您的 collectionView 应该垂直滚动您的单元格。

快乐编程。

于 2013-12-16T23:28:13.423 回答
0

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

于 2013-12-11T12:52:23.203 回答
0

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

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

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

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

还要确保您已实施:

- (CGSize) collectionViewContentSize;

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

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

- (void)prepareLayout

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

于 2012-12-21T12:10:57.040 回答
0

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

于 2020-04-07T12:07:02.370 回答
0

Xcode 11+,斯威夫特 5。

我解决了我的问题,我准备了视频代码

于 2019-12-11T06:46:10.107 回答