我想使用UICollectionView
来显示缩略图的水平可滚动列表,但是,我希望这是一行。在另一个视图中,我在UICollectionView
中显示缩略图,但是这个缩略图垂直滚动,它在一列中。
目前,我这样做的方法是将集合视图的大小更改为仅对一个项目足够大,以便自动装配和工作,但现在我正在处理可变大小的项目,所以它不会再努力了。
如何让UICollectionView
显示一行或一列?
答案 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)
答案 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