Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/103.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios UICollectionView具有零项间距_Ios_Objective C_Uicollectionview_Uicollectionviewlayout - Fatal编程技术网

Ios UICollectionView具有零项间距

Ios UICollectionView具有零项间距,ios,objective-c,uicollectionview,uicollectionviewlayout,Ios,Objective C,Uicollectionview,Uicollectionviewlayout,我正在尝试对UICollectionViewFlowLayout进行子类化,以便消除单元格之间的空间,因为flow布局只允许设置MinimumItemSpacing,而不允许设置MaximumItemSpacing。我需要一个collectionView,它可以垂直滚动动态单元格高度,并且单元格之间没有空间。以下是我在UICollectionViewFlowLayout子类中尝试的内容: 虽然这似乎消除了项目间距,但也产生了奇怪的副作用。有些细胞最终太高,而另一些细胞则在大小上跳跃。而且,如果我

我正在尝试对UICollectionViewFlowLayout进行子类化,以便消除单元格之间的空间,因为flow布局只允许设置MinimumItemSpacing,而不允许设置MaximumItemSpacing。我需要一个collectionView,它可以垂直滚动动态单元格高度,并且单元格之间没有空间。以下是我在UICollectionViewFlowLayout子类中尝试的内容:

虽然这似乎消除了项目间距,但也产生了奇怪的副作用。有些细胞最终太高,而另一些细胞则在大小上跳跃。而且,如果我滚动得很快,一些单元格根本就不会出现。有人知道我怎样才能最好地实现这个看似简单的事情吗

谢谢

您需要在布局上设置最小行间距:

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

您正在为同一行中的项目设置MinimumItemSpacing:

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


您当前的问题是因为您正在将项目移动到传递到布局的rect中,这样您可以在其中容纳更多的项目,但是您没有添加额外的项目来填充该空间,因此您看到了间隙。但是,您根本不需要覆盖它,只需设置“行间距”属性即可

您是每行有多个单元格,还是它们像表格一样叠在一起?这里的问题是,您仍然为特定的矩形返回相同数量的布局属性对象,即使您移动该矩形中项目的位置,以便可以在其中容纳额外的单元格,这就是为什么您会看到间隙
- (NSArray *) layoutAttributesForElementsInRect:(CGRect)rect {
    NSArray *answer = [[super layoutAttributesForElementsInRect:rect] mutableCopy];

    for(int i = 1; i < [answer count]; i++) {
        UICollectionViewLayoutAttributes *currentLayoutAttributes = answer[i];
        UICollectionViewLayoutAttributes *prevLayoutAttributes = answer[i - 1];
        NSInteger maximumSpacing = 0;
        NSInteger origin = prevLayoutAttributes.frame.origin.y + prevLayoutAttributes.frame.size.height;
        if(origin + maximumSpacing + currentLayoutAttributes.frame.size.height < self.collectionViewContentSize.height) {
            CGRect frame = currentLayoutAttributes.frame;
            frame.origin.y = origin + maximumSpacing;
            currentLayoutAttributes.frame = frame;
        }
    }
    return answer;
}