minimumInteritemSpacing在集合视图的末尾添加一些奇怪的内容

时间:2017-03-23 15:45:23

标签: ios swift autolayout uicollectionview uicollectionviewlayout

我正在尝试只用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,这是意料之外的事情。

有人解决了这个问题吗?

bug

3 个答案:

答案 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];

}

注意:我的集合视图具有恒定的高度。