我想用来UICollectionView
显示缩略图的水平滚动列表,但是,我希望它是单行。在另一个视图中,我在 a 中显示缩略图,UICollectionView
但这个是垂直滚动的,并且它在一个列中。
目前,我这样做的方式是将集合视图的大小更改为仅足以容纳一个项目,以便它自动包装并工作,但现在我正在处理可变大小的项目,所以它不再工作了。
如何使UICollectionView
显示一行或一列?
我想用来UICollectionView
显示缩略图的水平滚动列表,但是,我希望它是单行。在另一个视图中,我在 a 中显示缩略图,UICollectionView
但这个是垂直滚动的,并且它在一个列中。
目前,我这样做的方式是将集合视图的大小更改为仅足以容纳一个项目,以便它自动包装并工作,但现在我正在处理可变大小的项目,所以它不再工作了。
如何使UICollectionView
显示一行或一列?
我猜你正在使用内置的Flow Layout
. 但是,对于您的情况,您应该自定义UICollectionView Layout
. 使其成为子类UICollectionViewFlowLayout
并在方法中添加以下代码init
:
- (id)init {
if ((self = [super init])) {
self.scrollDirection = UICollectionViewScrollDirectionHorizontal;
self.minimumLineSpacing = 10000.0f;
}
return self;
}
这是让它在这里minimumLineSpacing
有一条线的关键。
我希望这有帮助!
我发现设置minimumLineSpacing
刚刚使我的滚动区域非常大,并且设置minimumInteritemSpacing=big
完成将项目保持在一个滚动行或列中,居中在collectionview
.
如果您可以信任类型转换,则没有真正的理由进行子类化。
((UICollectionViewFlowLayout *)self.collectionView.collectionViewLayout).minimumLineSpacing = 1000.0f;
如果你从一个 nib 加载你的 collectionView,你也可以在 Attributes 和 Size Inspectors 中使用参数。
滚动方向也是如此。
当您初始化时,在 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)
在 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
为该函数调用的输出,一切就绪。
对于斯威夫特 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
我认为文档是最好的:
minimumLineSpacingForSectionAt
:
对于垂直滚动网格,此值表示连续行之间的最小间距。对于水平滚动网格,此值表示连续列之间的最小间距。此间距不适用于页眉和第一行之间或最后一行和页脚之间的空间。
minimumInteritemSpacingForSectionAt
:
对于垂直滚动网格,此值表示同一行中项目之间的最小间距。对于水平滚动网格,此值表示同一列中项目之间的最小间距。这个间距是用来计算一行可以放多少个item,但是在item个数确定后,实际间距可能会向上调整。
因此,如果您scrollDirection
是水平的,则需要设置minimumInteritemSpacingForSectionAt
为CGFloat.greatestFiniteMagnitude
,如果scrollDirection
是垂直的,则需要设置minimumLineSpacingForSectionAt
为CGFloat.greatestFiniteMagnitude
以获取一行collectionView
我想要一列,左对齐,其他答案对我没有帮助。
所以这是我非常简单的一列解决方案,左对齐:
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
从其他解决方案。
希望这会有所帮助,因为与其他答案相比,这是一种完全不同的方法。
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];