swift 如何使用组合布局在UICollectionView中等间距地放置固定大小的单元格?

xt0899hw  于 2023-01-01  发布在  Swift
关注(0)|答案(3)|浏览(227)

我有一个使用组合布局创建的集合视图。每个项都有固定的宽度和高度,并且部分占据了表的整个宽度(它本身占据了整个屏幕的宽度)。我正在尝试创建一个算法来计算内容和部分插入,使每个项目之间的空间相等,屏幕边框之间的空间也相等。换句话说,所有物体之间的距离应该是相同的。
以下是计算内容和章节插图的方法:

// width is 414
private func getContentInsets(width: CGFloat) -> NSDirectionalEdgeInsets {
    let totalItemsInRow = Int(width / 120) // 3
    let totalCellWidth = 120 * totalItemsInRow // 360
    let remainingSpace = width - CGFloat(totalCellWidth) // 54
    let marginPerItem = remainingSpace / CGFloat(totalItemsInRow) // 18
    return NSDirectionalEdgeInsets(top: 8, leading: marginPerItem / 2, bottom: 8, trailing: marginPerItem / 2)
}

// width is 414    
private func getSectionContentInsets(width: CGFloat) -> NSDirectionalEdgeInsets {
    let totalItemsInRow = CGFloat(Int(width / 120)) // 3
    return NSDirectionalEdgeInsets(top: 0,
                                   leading: getContentInsets(width: width).leading * totalItemsInRow, // 9 * 3 = 27
                                   bottom: 0,
                                   trailing: getContentInsets(width: width).trailing * totalItemsInRow) // 9 * 3 = 27
}

使用这些方法,我可以有一个平等的项目之间的空间。但他们有一个不同的空间到屏幕的边界,正如我们可以看到的图像下:

那么,我怎样才能改变这些算法来实现项目之间的相等空间,以及屏幕边框之间的相等空间(所有内容都应该具有相同的空间)呢?

gmol1639

gmol16391#

多亏了Felipe只给前导值赋值的想法,我才得以修正算法。不幸的是,这个公式并没有解决问题,因为集合视图的尾部边界仍然留有一小块空间。我还注意到,用于在集合视图的单元格之间添加空间的正确属性是edgeSpacing,而不是contentInsets
所以我删除了插入的部分,并将edgeSpacing赋值为:

private func getEdgeSpacing(width: CGFloat) -> NSCollectionLayoutEdgeSpacing {
    let totalItemsInRow = Int(width / 120)
    let totalCellWidth = 120 * totalItemsInRow
    let remainingSpace = width - CGFloat(totalCellWidth)
    let totalMargins = totalItemsInRow
    let marginPerItem = remainingSpace / CGFloat(totalMargins)
    return NSCollectionLayoutEdgeSpacing(leading: NSCollectionLayoutSpacing.fixed(marginPerItem / 2),
                                         top: nil,
                                         trailing: NSCollectionLayoutSpacing.fixed(marginPerItem / 2),
                                         bottom: nil)
}

唯一的固定值是120,它是每个单元格的固定宽度。

t5fffqht

t5fffqht2#

嗯......我想你可以通过改变计算的结尾来完成它。
54 /(numberOfCells + 1)并仅将此值分配给前导

xxhby3vn

xxhby3vn3#

let group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize, subitems: [item])
        group.contentInsets = .init(top: 0, leading: 0, bottom: 0, trailing: 0)
        group.edgeSpacing = .init(leading: .fixed(135), top: nil, trailing: .fixed(135), bottom: nil)
    
        let section = NSCollectionLayoutSection(group: group)
        section.contentInsets = .init(top: 0, leading: 0, bottom: 0, trailing: 0)
        // 135(leading)+135(trailing)-108(Space) = -162
        section.interGroupSpacing = -162

https://github.com/MilanSavaliya321/Compositional-Collection-View-Layouts

相关问题