39

我想用来UICollectionView显示缩略图的水平滚动列表,但是,我希望它是单行。在另一个视图中,我在 a 中显示缩略图,UICollectionView但这个是垂直滚动的,并且它在一个列中。

目前,我这样做的方式是将集合视图的大小更改为仅足以容纳一个项目,以便它自动包装并工作,但现在我正在处理可变大小的项目,所以它不再工作了。

如何使UICollectionView显示一行或一列?

4

10 回答 10

30

我猜你正在使用内置的Flow Layout. 但是,对于您的情况,您应该自定义UICollectionView Layout. 使其成为子类UICollectionViewFlowLayout并在方法中添加以下代码init

- (id)init {
    if ((self = [super init])) {
        self.scrollDirection = UICollectionViewScrollDirectionHorizontal;
        self.minimumLineSpacing = 10000.0f;
    }
    return self; 
}

这是让它在这里minimumLineSpacing有一条线的关键。

我希望这有帮助!

于 2013-01-10T10:53:46.017 回答
12

我发现设置minimumLineSpacing刚刚使我的滚动区域非常大,并且设置minimumInteritemSpacing=big完成将项目保持在一个滚动行或列中,居中在collectionview.

于 2013-05-07T13:00:27.957 回答
9

如果您可以信任类型转换,则没有真正的理由进行子类化。

((UICollectionViewFlowLayout *)self.collectionView.collectionViewLayout).minimumLineSpacing = 1000.0f;

如果你从一个 nib 加载你的 collectionView,你也可以在 Attributes 和 Size Inspectors 中使用参数。

滚动方向也是如此。

于 2013-05-15T03:40:10.287 回答
7

当您初始化时,在 init 参数中UICollectionView传递以下内容。UICollectionViewFlowLayout

注意:您不需要创建子类UICollectionViewFlowLayout

var collectionViewFlowControl = UICollectionViewFlowLayout()
collectionViewFlowControl.scrollDirection = UICollectionViewScrollDirection.Horizontal

对于 0 px 单元格间距:

collectionViewFlowControl.minimumInteritemSpacing = 0;
collectionViewFlowControl.minimumLineSpacing = 0;

collectionView = UICollectionView(frame: CGRectMake(0, 0, self.view.frame.size.width, 120), collectionViewLayout: collectionViewFlowControl)
于 2015-09-15T11:16:17.063 回答
6

在 iOS 13 中,感谢 UICollectionViewCompositionalLayout,这很简单,因为您可以指定水平布局中每列的单元格数,或垂直布局中每行的单元格数。这是一个简单的示例,用于单个水平滚动、垂直居中的单元格行:

func layout() -> UICollectionViewCompositionalLayout {
    let itemSize = NSCollectionLayoutSize(
        widthDimension: .fractionalWidth(1),
        heightDimension: .fractionalHeight(1))
    let item = NSCollectionLayoutItem(layoutSize: itemSize)
    let groupSize = NSCollectionLayoutSize(
        widthDimension: .absolute(75),
        heightDimension: .absolute(75))
    let group = NSCollectionLayoutGroup.vertical(
        layoutSize: groupSize, subitem: item, count: 1) // *
    group.edgeSpacing = NSCollectionLayoutEdgeSpacing(
        leading: nil, top: .flexible(0),
        trailing: nil, bottom: .flexible(0))
    let section = NSCollectionLayoutSection(group: group)
    section.interGroupSpacing = 65
    let config = UICollectionViewCompositionalLayoutConfiguration()
    config.scrollDirection = .horizontal
    let layout = UICollectionViewCompositionalLayout(
        section: section, configuration:config)
    return layout
}

将您的集合视图设置collectionViewLayout为该函数调用的输出,一切就绪。

于 2019-12-06T02:36:58.780 回答
2

对于斯威夫特 3

let flowLayout = UICollectionViewFlowLayout()
flowLayout.itemSize = CGSize(width: UIScreen.main.bounds.width/2-10, height: 190)
flowLayout.sectionInset = UIEdgeInsetsMake(0, 5, 0, 5)
flowLayout.scrollDirection = UICollectionViewScrollDirection.horizontal
flowLayout.minimumInteritemSpacing = 0.0
self.gCollectionView.collectionViewLayout = flowLayout
于 2018-04-09T10:35:19.013 回答
2

无论 CollectionView 的高度如何,这对我来说都可以获取单行单元格。将单元格的最小间距设置为 1000

故事板 UICollectionView

于 2019-07-17T15:20:54.463 回答
1

我认为文档是最好的:

minimumLineSpacingForSectionAt

对于垂直滚动网格,此值表示连续行之间的最小间距。对于水平滚动网格,此值表示连续列之间的最小间距。此间距不适用于页眉和第一行之间或最后一行和页脚之间的空间。

minimumInteritemSpacingForSectionAt

对于垂直滚动网格,此值表示同一行中项目之间的最小间距。对于水平滚动网格,此值表示同一列中项目之间的最小间距。这个间距是用来计算一行可以放多少个item,但是在item个数确定后,实际间距可能会向上调整。

因此,如果您scrollDirection是水平的,则需要设置minimumInteritemSpacingForSectionAtCGFloat.greatestFiniteMagnitude,如果scrollDirection是垂直的,则需要设置minimumLineSpacingForSectionAtCGFloat.greatestFiniteMagnitude以获取一行collectionView

于 2019-12-05T17:47:32.387 回答
1

我想要一列,左对齐,其他答案对我没有帮助。

所以这是我非常简单的一列解决方案,左对齐:

class GCOneColumnLeftAlignedFlowLayout: UICollectionViewFlowLayout {
    override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
        let attributes = super.layoutAttributesForElements(in: rect)

        var y: CGFloat = sectionInset.top
        attributes?.forEach { layoutAttribute in
            layoutAttribute.frame.origin.x = sectionInset.left
            layoutAttribute.frame.origin.y = y
            y = y + layoutAttribute.frame.height + minimumLineSpacing
        }

        return attributes
    }
}

你还应该设置类似

estimatedItemSize = CGSize(width: 120, height: 40)

不要忘记删除线

minimumLineSpacing = big number

从其他解决方案。

希望这会有所帮助,因为与其他答案相比,这是一种完全不同的方法。

于 2018-08-20T17:49:45.527 回答
0
 UICollectionViewFlowLayout *layout=[[UICollectionViewFlowLayout alloc] init];
 [layout setScrollDirection:UICollectionViewScrollDirectionHorizontal];

 layout.minimumInteritemSpacing = 0;
 layout.minimumLineSpacing = 0;


 blendEffectCollectionView=[[UICollectionView alloc] initWithFrame:CGRectMake(0, 95, 320, 60) collectionViewLayout:layout];
 [blendEffectCollectionView setDataSource:self];
 [blendEffectCollectionView setDelegate:self];
 [blendEffectCollectionView registerClass:[BlendModeCell class] forCellWithReuseIdentifier:@"cellIdentifier"];
 [blendEffectCollectionView setBackgroundColor:[UIColor clearColor]];

 [bottomActivityView addSubview:blendEffectCollectionView];
于 2017-04-26T05:58:43.810 回答