UICollectionView不服从UICollectionViewDelegateFlowLayout和insets

时间:2017-12-13 01:03:40

标签: ios swift uicollectionview

所以我有一个具有以下代码的CollectionView:

class MyViewController: UIViewController {
    ...
    @IBOutlet weak var imageCollectionView: UICollectionView!
    fileprivate let sectionInsets = UIEdgeInsets(top: 1, left: 1, bottom: 1, right: 1)
    fileprivate let itemsPerRow: CGFloat = 3
    ...

    override func viewDidLoad() {
        super.viewDidLoad()
        imageCollectionView.delegate = self
        imageCollectionView.dataSource = self
   }
}

...

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

        let paddingSpace = sectionInsets.left * (itemsPerRow + 1)
        let availableWidth = collectionView.bounds.width - paddingSpace
        let widthPerItem = availableWidth / itemsPerRow

        return CGSize(width: widthPerItem, height: widthPerItem)
    }

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

    func collectionView(_ collectionView: UICollectionView,
                        layout collectionViewLayout: UICollectionViewLayout,
                        minimumLineSpacingForSectionAt section: Int) -> CGFloat {
        return sectionInsets.left
    }
}

我想要的是每行3个单元格,之间的空间非常小,但每当我运行应用程序时,我会得到这样的结果: enter image description here

每个黑色块都是一个单元格。

对于我发现的类似问题,答案通常是实现我已经完成的UICollectionViewDelegateFlowLayout函数,我的函数被调用但是没有按预期工作!即使我手动将widthPerItem值更改为略小,它仍然无效!

任何人都可以看到我是否遗漏了明显的东西吗? 谢谢!

1 个答案:

答案 0 :(得分:3)

您确定最小的项目间距设置为仅1分吗? 您可以在Interface Builder中或通过覆盖以下委托方法进行设置:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
    return 1.0;
}

我看到的另一个可能原因是将availableWidth除以itemsPerRow的结果是一个浮点数。最后,单元格宽度和插图的总和实际上可能超过集合视图宽度0.x像素。为确保不会发生这种情况,您可能需要使用floor

func collectionView(_ collectionView: UICollectionView,
                    layout collectionViewLayout: UICollectionViewLayout,
                    sizeForItemAt indexPath: IndexPath) -> CGSize {
    let paddingSpace = sectionInsets.left * (itemsPerRow + 1)
    let availableWidth = collectionView.bounds.width - paddingSpace
    let widthPerItem = floor(availableWidth / itemsPerRow)

    return CGSize(width: widthPerItem, height: widthPerItem)
}