我正在尝试只用1行实现水平滚动集合视图。我发现最简单的方法是准备自定义流程布局:
class CollectionViewLayoutHorizontal : UICollectionViewFlowLayout {
override init() {
super.init()
//that enables self-sizing cells
self.estimatedItemSize = CGSize(width: 1, height: 1)
self.scrollDirection = .horizontal
//that one should ensure that only one line fits
//using CGFloat.greatestFiniteMagnitude aka CGFLOATMAX breaks collection view completely
self.minimumInteritemSpacing = 1000
self.minimumLineSpacing = 10
}
}
我的所有细胞都被正确显示 - 它们在集合视图的中间位置彼此相邻,即使它们小得多。
但问题是在末尾(在最后一个单元格之后)有一个额外的空白空间,其大小为minimumInteritemSpacing
,这是意料之外的事情。
有人解决了这个问题吗?
答案 0 :(得分:1)
我知道这是一个老问题,但是仍然没有明确的答案。
我最近在iOS 12上使用Swift 4.2遇到了这个完全相同的问题。经过一些调查,我发现如果将minimumLineSpacing
设置为小于默认值(即10
)的任何内容然后流程布局会将这个差值乘以(项目数-1),作为额外的空间到集合视图的末尾。 (看起来总contentSize
是使用默认值计算的,无论如何?)
无论如何,我可以通过将minimumInteritemSpacing
设置为与minimumLineSpacing
相同的值来解决这个问题,在我的情况下,两者均为2
。
我知道这没有任何意义,因为我的集合视图是单行的,具有水平滚动的集合视图流程布局,因此minimumInteritemSpacing
在布局项目上没有任何价值,但显然它确实可以这样就可以消除最后多余的空间。我希望这会对某人有所帮助。
答案 1 :(得分:0)
如果您不需要在集合视图中设置尾随空格,请设置minimumInteritemSpacing
(或在滚动结束时适合您的集合设计的较小值)。
对于垂直滚动网格,minimumInteritemSpacing
值表示同一行中项目之间的最小间距。
对于水平滚动网格,minimumInteritemSpacing
值表示同一列中项目之间的最小间距。
{{1}}间距用于计算单行中可以容纳的项目数,但在确定项目数后,实际间距可能会向上调整。
有关更多信息,请参阅Apple开发人员文档:minimumInteritemSpacing
答案 2 :(得分:0)
尝试通过以下方式实现:
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
return CGSizeMake(70, 60);
}
- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section{
return UIEdgeInsetsMake(0, 0, 0, 0);
}
并设置集合视图的流程布局:
-(void)setCollectionViewLayout {
UICollectionViewFlowLayout *flow = [[UICollectionViewFlowLayout alloc] init];
flow.scrollDirection = UICollectionViewScrollDirectionHorizontal;
flow.minimumInteritemSpacing = 5;
flow.minimumLineSpacing = 5;
[yourCollectionview setCollectionViewLayout:flow];
}
注意:我的集合视图具有恒定的高度。