删除 UICollectionView 底部的插入间距

Remove inset spacing at bottom of UICollectionView

我真的需要一些帮助。我已经尝试了几天,但似乎无法修复它...

我正在尝试以 UICollectionView 网格样式布置图像,并禁用滚动。所以我有 4 images/cells,我试图用这些图像完全填充 UICollectionView,它们之间有 1 个间距。

问题 然而,单元格之间的间距在中心和底部之间分开。

我注意到,当将 UICollectionView 的 scrollDirection 从垂直更改为水平时,问题仍然存在,但也改变了方向,所以我猜它与此有关。

示例:

代码:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {

        if isInFeed && self.postImages!.count > 1 {

            guard let flowLayout = collectionViewLayout as? UICollectionViewFlowLayout else {
                return CGSize()
            }
            flowLayout.minimumInteritemSpacing = 1
            flowLayout.minimumLineSpacing = 1

            switch (self.postImages!.count) {

            case 2:
                // we split the collectionView into 2 parts (+ 2*0.5 spacing)
                return CGSize(width: (self.collectionView!.bounds.width/2)-CGFloat(0.5), height: self.collectionView!.bounds.height)

            case 3:

                // we split the collectionView into 3 parts, the first one taking up half, the other 2 images taking up 1/4th (+spacing)
                if indexPath.row == 0 { return CGSize(width: (self.collectionView!.bounds.width/2)-CGFloat(0.5), height: self.collectionView!.bounds.height) }
                else { return CGSize(width: (self.collectionView!.bounds.width/2)-CGFloat(0.5), height: (self.collectionView!.bounds.height/2)-CGFloat(0.5)) }

            case 4:
            // we split the collectionView into 4 parts (1/4th + spacing)


//                if indexPath.section == 0 { return CGSize(width: (self.collectionView!.bounds.width/2)-CGFloat(0.5), height: (self.collectionView!.bounds.height/2)-CGFloat(1))}
//                else {return CGSize(width: (self.collectionView!.bounds.width/2)-CGFloat(0.5), height: (self.collectionView!.bounds.height/2)-CGFloat(0))}

                return CGSize(width: (self.collectionView!.bounds.width/2)-CGFloat(0.5), height: (self.collectionView!.bounds.height/2)-CGFloat(0.5))

            default: break
            }
        }
        // If not in Feed or just one image, take up entire collectionView
        return CGSize(width: self.collectionView!.bounds.width, height: self.collectionView!.bounds.height)
    }

我也尝试过子类化 UICollectionViewLayoutUICollectionViewFlowLayout,但没有成功,我已经阅读了 Apple 的文档,但这似乎没什么帮助。

希望这清楚地说明了问题,我很乐意详细说明。 祝你有美好的一天!

编辑:

我将滚动方向从垂直更改为水平,并为每个单元格添加了 2 个额外的计算间距,只是为了展示如果我这样做会发生什么。

编辑 2:

终于解决了! (虽然没有我想要的那么干净,但它现在可以工作了) 我将以下代码放在 collectionViewLayout 方法中:

if indexPath.section == 0 {
     flowLayout.sectionInset = UIEdgeInsetsMake(0, 0, 0, 1 * UIScreen.main.scale)
 } else {
     flowLayout.sectionInset = UIEdgeInsets.zero
 }

非常感谢大家的帮助!

试试这个代码。添加一个函数并在视图中调用并加载。您可能需要做一些调整,但它适用于我的情况。

    let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
    let width = UIScreen.main.bounds.width
    layout.sectionInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
    layout.itemSize = CGSize(width: width / 2, height: width / 2)
    layout.minimumInteritemSpacing = 0
    layout.minimumLineSpacing = 0
    collectionView!.collectionViewLayout = layout

在 Storyboard 中尝试使用 Size Inspector,最小间距为零,所有部分昆虫为零。

layout.minimumLineSpacing = 1.0f;
layout.minimumInteritemSpacing = 1.0f;

CGSize collectionSize = collectionView.frame.size;
CGFloat cellsPerRow = 2.0f;
CGFloat spacing = 0.5f;

CGFloat itemWidth = collectionSize.width/cellsPerRow - spacing;
CGFloat itemHeight = collectionSize.height/cellsPerRow - spacing;

return CGSizeMake(itemWidth,itemHeight);

对我有用的最终解决方案(对于遇到类似情况的任何人):

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {

    if section == 0 {
        return UIEdgeInsetsMake(0, 0, 0, 1 * UIScreen.main.scale)
    } else {
        return UIEdgeInsets.zero
    }
}