UICollectionView:一行或一列

时间:2012-12-17 16:44:51

标签: iphone objective-c ios xcode uicollectionview

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

目前,我这样做的方法是将集合视图的大小更改为仅对一个项目足够大,以便自动装配和工作,但现在我正在处理可变大小的项目,所以它不会再努力了。

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

10 个答案:

答案 0 :(得分:26)

我猜你正在使用内置的Flow Layout。 但是,对于您的情况,您应该制作自定义UICollectionView Layout。 将其设为UICollectionViewFlowLayout的子类,并在init方法中添加此代码:

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

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

我希望这有帮助!

答案 1 :(得分:12)

我发现设置minimumLineSpacing只是让我的滚动区域非常大,设置minimumInteritemSpacing=big完成了将项目保存在一个滚动的行或列中,位于{{1}的中间位置}。

答案 2 :(得分:9)

如果您可以信任类型转换,则没有真正的原因可以继承。

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

如果你从一个笔尖加载了你的collectionView,你也可以使用属性和大小检查器中的参数。

滚动方向也一样。

答案 3 :(得分:2)

初始化UICollectionView时,会在init参数中传递以下UICollectionViewFlowLayout

注意:您不需要创建UICollectionViewFlowLayout

的子类
var collectionViewFlowControl = UICollectionViewFlowLayout()
collectionViewFlowControl.scrollDirection = UICollectionViewScrollDirection.Horizontal

对于0 px Cell Spacing:

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

collectionView = UICollectionView(frame: CGRectMake(0, 0, self.view.frame.size.width, 120), collectionViewLayout: collectionViewFlowControl)

答案 4 :(得分:2)

对于Swift 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

答案 5 :(得分:1)

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

Storyboard UICollectionView

答案 6 :(得分:1)

在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
}

答案 7 :(得分: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];

答案 8 :(得分:0)

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

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

void
myViewArea::applyItemsFilter(const QString &searchString)
{
    for (int i = 0; i < model.rowCount(QModelIndex()); i += 1) {
        QCoreApplication::processEvents();    // <<< Let other things happen
        setRowHidden(
            i,
            searchString.isEmpty()
                ? false
                : !model.isMatched(i, searchString)
        );
    }
}

您还应该设置类似

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)

从其他解决方案开始。

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

答案 9 :(得分:0)

我认为文档是最好的:

minimumLineSpacingForSectionAt

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

minimumInteritemSpacingForSectionAt

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

因此,如果scrollDirection是水平的,则需要将minimumInteritemSpacingForSectionAt设置为CGFloat.greatestFiniteMagnitude,如果scrollDirection是垂直的,则需要将minimumLineSpacingForSectionAt设置为CGFloat.greatestFiniteMagnitude用于获得一行collectionView