Collectionview固定单元格间距

时间:2016-12-21 04:10:52

标签: ios swift uicollectionview

我一直在寻找如何让UICollectionView在其单元格之间保持固定间距,但到目前为止尚未找到解决方案。

我有一个UICollectionView,它由两列组成,所有单元格都有相同的宽度,但它们的高度不同。我在这个UICollectionView中只有一个部分。

我已将最小间距设置为10(这是我在垂直单元格之间想要的值),但系统似乎是随机拉伸垂直空间。

我想要实现的是,维基百科iPad的效果是:不同的文章瓷砖具有相同的宽度,但可根据需要调整高度,但所有单元格均匀垂直的空间。 (我不介意在最后留空间,但我不想在中间留出额外的空间)

我应该如何实现这一目标?如果很容易迁移现有的UICollectionViews(当然还有它的开源),我会接受第三方库。

3 个答案:

答案 0 :(得分:2)

在swift 3中, 您可以在collectionView:

中为单元格间距实现此委托方法
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize{
    // Give cell width and height
    return CGSize(width: 750, height: 320)
}

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat{
    // splace between two cell horizonatally
    return 50
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat{
    // splace between two cell vertically
    return 100
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets{
    // give space top left bottom and right for cells
    return UIEdgeInsets(top: 0, left: 100, bottom: 100, right: 100)
}

答案 1 :(得分:0)

好吧,原因毕竟是我设置的间距是单元格之间的 MINIMUM 间距。 collectionView可以使用在同一行上对齐单元格所需的任何间距,只要它不小于最小值。

答案 2 :(得分:0)

如果你想在 UICollectionView 上有固定的项目间距,你可以使用下面的自定义布局。注意:我为固定高度的单元格和 .vertical 滚动方向创建了这个布局。

class CollectionViewFlowLayout: UICollectionViewFlowLayout {

override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
    guard let layoutAttributes = super.layoutAttributesForElements(in: rect) else {
        return nil
    }
    
    var startX: CGFloat = 0.0
    var startY: CGFloat = 0.0
    let contentWidth = collectionView?.frame.width ?? 0
    
    for layoutAttributes in layoutAttributes {
        let size = layoutAttributes.size
        if (startX + size.width + minimumInteritemSpacing) > contentWidth {
            startX = 0
            startY += size.height
            startY += minimumLineSpacing
        }
        let origin = CGPoint(x: startX, y: startY)
        let frame = CGRect(origin: origin, size: size)
        layoutAttributes.frame = frame
        startX += size.width + minimumInteritemSpacing
    }
    return layoutAttributes
}

}