ios - 如何防止我的节标题与组合布局中的单元格重叠

标签 ios swift uicollectionview ios14 uicollectionviewcompositionallayout

我希望标题出现在我的组合布局中每个部分的上方,但我找不到一种方法让它们出现在内容上方而不是重叠,这是我的布局代码:

func createLayout() -> UICollectionViewLayout {
    
    let config = UICollectionViewCompositionalLayoutConfiguration()
    config.scrollDirection = .horizontal
    config.interSectionSpacing = 16
    
    let layout = UICollectionViewCompositionalLayout(sectionProvider: {
        
        (sectionIndex: Int, layoutEnvironment: NSCollectionLayoutEnvironment) -> NSCollectionLayoutSection? in
        
        let leadingItem = NSCollectionLayoutItem(
            layoutSize: NSCollectionLayoutSize(widthDimension: .fractionalWidth(1),
                                               heightDimension: .estimated(50)))
        
        let widthFraction: CGFloat = UIScreen.main.bounds.size.width > UIScreen.main.bounds.size.height ? 0.2 : 0.8
        let containerGroup = NSCollectionLayoutGroup.vertical(
            layoutSize: NSCollectionLayoutSize(widthDimension: .fractionalWidth(widthFraction),
                                               heightDimension: .estimated(50)),
            subitems: [leadingItem])
        
        let section = NSCollectionLayoutSection(group: containerGroup)
        section.boundarySupplementaryItems = [self.makeHeader()]
        section.orthogonalScrollingBehavior = .continuous
        section.interGroupSpacing = 16
        return section
        
    }, configuration: config)
    
    return layout
}

func makeHeader() -> NSCollectionLayoutBoundarySupplementaryItem {
    let widthFraction: CGFloat = UIScreen.main.bounds.size.width > UIScreen.main.bounds.size.height ? 0.2 : 0.8
    let size = NSCollectionLayoutSize(widthDimension: .fractionalWidth(widthFraction),
                                      heightDimension: .estimated(50))
    let sectionHeader = NSCollectionLayoutBoundarySupplementaryItem(layoutSize: size,
                                                                   elementKind: UICollectionView.elementKindSectionHeader,
                                                                    alignment: .top)
    return sectionHeader
}

这是所发生情况的屏幕截图,我需要上面显示“Column1”的文本,而不是与列单元格重叠: enter image description here

最佳答案

这是我的解决方案,但它只允许在我的部分上使用固定高度的标题:

你需要设置

section.supplementariesFollowContentInsets = false

然后偏移该部分:

section.contentInsets = NSDirectionalEdgeInsets(顶部:66,前导:8,底部:0,尾随:8)

func createLayout() -> UICollectionViewLayout {
    let config = UICollectionViewCompositionalLayoutConfiguration()
    config.scrollDirection = .horizontal
    let layout = UICollectionViewCompositionalLayout(sectionProvider: { (sectionIndex: Int, layoutEnvironment: NSCollectionLayoutEnvironment) -> NSCollectionLayoutSection? in

        let leadingItem = NSCollectionLayoutItem(
            layoutSize: NSCollectionLayoutSize(widthDimension: .fractionalWidth(1),
                                               heightDimension: .estimated(50)))

        let widthFraction: CGFloat = UIScreen.main.bounds.size.width > UIScreen.main.bounds.size.height ? 0.2 : 0.8
        let containerGroup = NSCollectionLayoutGroup.vertical(
            layoutSize: NSCollectionLayoutSize(widthDimension: .fractionalWidth(widthFraction),
                                               heightDimension: .estimated(50)),
            subitems: [leadingItem])

        let section = NSCollectionLayoutSection(group: containerGroup)
        section.boundarySupplementaryItems = [self.makeHeader()]
        section.supplementariesFollowContentInsets = false
        section.orthogonalScrollingBehavior = .continuous
        section.interGroupSpacing = 16
        section.contentInsets = NSDirectionalEdgeInsets(top: 66, leading: 8, bottom: 0, trailing: 8)
        return section

    }, configuration: config)
    return layout
}

func makeHeader() -> NSCollectionLayoutBoundarySupplementaryItem {
    let widthFraction: CGFloat = UIScreen.main.bounds.size.width > UIScreen.main.bounds.size.height ? 0.2 : 0.8
    let size = NSCollectionLayoutSize(widthDimension: .fractionalWidth(widthFraction),
                                      heightDimension: .absolute(50))
    let sectionHeader = NSCollectionLayoutBoundarySupplementaryItem(layoutSize: size, elementKind: UICollectionView.elementKindSectionHeader, alignment: .top)
    return sectionHeader

}

关于ios - 如何防止我的节标题与组合布局中的单元格重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69824394/

相关文章:

swift - 从 Collection View 单元格转到 TableView 单元格

ios - UILabel子类的TextColor

javascript - Phonegap - iOS - 谷歌地图 "Sorry no imagery here"

ios - 方法参数需要类型和协议(protocol)

ios - 在 iOS 中阅读网站

swift - 你怎么知道什么时候在 swift 中施放一个元素?

ios - iPhone 上的 HTML 音频标签隐藏了一半的高度

ios - 通知内容扩展是否需要新的配置文件?

ios - 使用 xib 创建 UICollectionViewCell 子类

ios - UICollectionView 不加载图像