【问题标题】:UICollectionView container paddingUICollectionView 容器填充
【发布时间】:2024-01-21 08:21:01
【问题描述】:

我正在尝试向 UICollectionView 的容器添加填充。我希望它看起来像这样,周围有一个 10pt 的填充。所以在示例屏幕中,底部有一个 10pt 的填充:

layout.minimumInteritemSpacing = layout.minimumLineSpacing = 10;

我正在使用 UICollectionViewFlowLayout 来布局单元格。我还尝试了一个“技巧”,在顶部添加一个 10pt 视图,但由于它们是分开的,因此内容似乎不会滚动视图。

【问题讨论】:

    标签: ios uicollectionview


    【解决方案1】:

    请尝试将以下代码放入viewDidLoad()

    collectionView!.contentInset = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)
    

    这将为 collectionView 的每一侧添加填充。


    PS:我知道这个问题已经有一段时间了,但它可能会对某人有所帮助;)

    【讨论】:

    • 非常感谢,这行得通。应该被标记为答案!
    【解决方案2】:

    您的UICollectionViewFlowLayoutsectionInset 属性似乎是您需要修改的。

    您可以使用UIEdgeInsetsMake 创建一个带有上、左、右和下边距的UIEdgeInsets,并将其设置为sectionInset 属性。

    这是UICollectionViewFlowLayout 的文档:https://developer.apple.com/library/ios/documentation/uikit/reference/UICollectionViewFlowLayout_class/Reference/Reference.html

    【讨论】:

    • 这是一个分页视图(垂直)。使用插入设置节标题只会影响第一页。还有其他想法吗?
    【解决方案3】:

    我使用了来自UICollectionViewDelegateFlowLayout 委托的几个方法来完成我正在寻找的东西。我试图向有阴影的单元格添加“填充”。这是为了确保它们具有“浮动”的效果,并且不会触及UICollectionView 的边缘。

    首先,调用sizeForItemAt indexPath 方法并给单元格一个大小:

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        return CGSize(width: collectionView.bounds.width * 0.80, height: collectionView.bounds.height * 0.98)
    }
    

    然后,调用insetForSectionAt section 方法,并设置单元格的插入:

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
        return UIEdgeInsets(top: 20, left: 25, bottom: 20, right: 25)
    }
    

    【讨论】:

      【解决方案4】:

      如果您使用配置,请将布局配置上的 contentInsetsReference 设置为跟随 layoutMargins,然后在 collectionView 本身上设置 layoutMargins。

      var config = UICollectionLayoutListConfiguration(appearance: .insetGrouped)
      config.headerMode = .supplementary
              
      let layout = UICollectionViewCompositionalLayout.list(using: config)
      layout.configuration.contentInsetsReference = .layoutMargins
              
      collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout)
              
      collectionView.layoutMargins = .init(top: 16, left: 64, bottom: 16, right: 64)
      

      【讨论】: