Ios 在uicollectionview中每行适配给定数量的单元格

Ios 在uicollectionview中每行适配给定数量的单元格,ios,objective-c,uicollectionview,uicollectionviewcell,Ios,Objective C,Uicollectionview,Uicollectionviewcell,我有一个集合视图,我希望每行有4个单元格。我知道要完成这个任务,我需要做的就是将collectionview.frame.size.width除以4。这很容易。然而,我不明白的是,如何考虑集合视图侧面的插图和单元格之间的间距。我在集合视图的左侧和右侧有10个像素的插图,单元之间有10个像素的间距。考虑到这些10像素的插入,我如何计算所需的单元格宽度 (collectionView.frame.size.width-50)/4 要计算空间,可以从集合视图帧宽度中减去它(减去5*10)。为了更好地

我有一个集合视图,我希望每行有4个单元格。我知道要完成这个任务,我需要做的就是将
collectionview.frame.size.width
除以4。这很容易。然而,我不明白的是,如何考虑集合视图侧面的插图和单元格之间的间距。我在集合视图的左侧和右侧有10个像素的插图,单元之间有10个像素的间距。考虑到这些10像素的插入,我如何计算所需的单元格宽度

(collectionView.frame.size.width-50)/4

要计算空间,可以从集合视图帧宽度中减去它(减去
5*10
)。

为了更好地解释数学,faarwa的示例仅适用于4个单元格。假设有一行,4个单元格项目有5个间隔块(伸出4个手指并计算从小指远端到食指远端的间隔)

一行中的n个单元格始终有n+1个空格。Faarwa假设每个空间是10,所以他将5个单元格乘以10得到50。您需要计算填充后剩余的工作空间-因此,如果假设屏幕宽度为200,则必须减去这两个值以获得剩余宽度,或“(collectionView.frame.size.width-50)”

继续使用200宽度假设和4个单元格项,您必须将差值(150)除以4,以获得每个单元格应具有相等间距的宽度

尝试并经历一些尝试和错误,但下面是我用来从集合对象数组中获取练习集集合视图的两种方法

// UICollectionViewDataSource method

    func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, 
sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {

    let numberOfSets = CGFloat(self.currentExSets.count)

    let width = (collectionView.frame.size.width - (numberOfSets * view.frame.size.width / 15))/numberOfSets

    let height = collectionView.frame.size.height / 2

    return CGSizeMake(width, height);
}

// UICollectionViewDelegateFlowLayout method

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

    let cellWidthPadding = collectionView.frame.size.width / 30
    let cellHeightPadding = collectionView.frame.size.height / 4
    return UIEdgeInsets(top: cellHeightPadding,left: cellWidthPadding, bottom: cellHeightPadding,right: cellWidthPadding)
}
截图:

两个单元格项目

四个单元格项目
Swift 3.0。适用于水平和垂直滚动方向以及可变间距

声明每行所需的单元格数

let numberOfCellsPerRow: CGFloat = 4
配置
flowLayout
以呈现指定的
numberOfCellsPerRow

if let flowLayout = collectionView?.collectionViewLayout as? UICollectionViewFlowLayout {
    let horizontalSpacing = flowLayout.scrollDirection == .vertical ? flowLayout.minimumInteritemSpacing : flowLayout.minimumLineSpacing
    let cellWidth = (view.frame.width - max(0, numberOfCellsPerRow - 1)*horizontalSpacing)/numberOfCellsPerRow
    flowLayout.itemSize = CGSize(width: cellWidth, height: cellWidth)
}

Swift 4+

UICollectionViewDataSource方法

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

    let noOfCellsInRow = 4

    let flowLayout = collectionViewLayout as! UICollectionViewFlowLayout

    let totalSpace = flowLayout.sectionInset.left
        + flowLayout.sectionInset.right
        + (flowLayout.minimumInteritemSpacing * CGFloat(noOfCellsInRow - 1))

    let size = Int((collectionView.bounds.width - totalSpace) / CGFloat(noOfCellsInRow))

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

iOS 13 Swift 5+

Collectionview估计大小必须none

声明单元格的边距

let margin: CGFloat = 10
在viewDidLoad中配置
最小行间距
最小行间距
节插入

 guard let collectionView = yourCollectionView, let flowLayout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout else { return }

    flowLayout.minimumInteritemSpacing = margin
    flowLayout.minimumLineSpacing = margin
    flowLayout.sectionInset = UIEdgeInsets(top: margin, left: margin, bottom: margin, right: margin)
UICollectionViewDataSource方法
SizeForestMat

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

    let noOfCellsInRow = 2   //number of column you want
    let flowLayout = collectionViewLayout as! UICollectionViewFlowLayout
    let totalSpace = flowLayout.sectionInset.left
        + flowLayout.sectionInset.right
        + (flowLayout.minimumInteritemSpacing * CGFloat(noOfCellsInRow - 1))

    let size = Int((collectionView.bounds.width - totalSpace) / CGFloat(noOfCellsInRow))
    return CGSize(width: size, height: size)
}

是的,(我想)我有完全相同的代码,但它不起作用。它快把我逼疯了…我学数学学不了这么多。。结果是,我使用了书面的view.frame.size.width而不是collection视图。。再次感谢!请添加一个解释,解释为什么这样做,或者它是如何让其他人受益的。你可以在这里看到我的答案,这是你收藏视图的出口。