【问题标题】:How to set no spacing in UICollectionViewDelegateFlowLayout?如何在 UICollectionViewDelegateFlowLayout 中设置无间距?
【发布时间】:2020-04-16 22:59:23
【问题描述】:

我正在尝试在屏幕宽度的三分之一处使用 3 个项目来执行 UICollectionViewDelegateFlowLayout。由于某种原因,它增加了间距并且不符合方形布局。

这里是 UICollectionViewDelegateFlowLayout 函数。

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
     let yourWidth = (collectionView.bounds.width/3.0) - 2

     let yourHeight = yourWidth



        return CGSize(width: yourWidth, height: yourHeight)
    }
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
        //return UIEdgeInsets.zero
        return UIEdgeInsets(top: 0,left: 0,bottom: 0,right: 0);
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
        return 1
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
        return 1
    }

请不要建议在 viewDidLoad 方法中为集合视图添加布局。我试过了,它没有用,因为它删除了我的标题。

【问题讨论】:

  • (collectionView.bounds.width - 2) / 3.0 我认为这是计算 1/3 宽度且单元格之间只有 1 个像素间距的公式
  • 你能告诉我你的xcode版本吗?

标签: ios swift uicollectionview uicollectionviewflowlayout


【解决方案1】:
class VC : UICollectionViewDelegateFlowLayout, UICollectionViewDelegate {



func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
 let yourWidth = (collectionView.frame.width - 4)/3
      // your minimumInteritemSpacing is 1, hence 4

 let yourHeight = yourWidth

    return CGSize(width: yourWidth, height: yourHeight)
}



}

你也可以试试:

 override func viewDidLoad() {
    super.viewDidLoad()

   let layout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout
    layout?.estimatedItemSize = .init()
    layout?.headerReferenceSize = .init()

 }

【讨论】:

  • 第一个不起作用。第二个有更多代码吗?另外,如果我使用第二个似乎删除了我的标题。如何在使用第二个时保留标题?
  • 你是如何设置标题大小的?我编辑了我的答案,您可以添加:layout?.headerReferenceSize = .init()
  • 我在情节提要中设置了标题大小。编辑后这仍然不起作用。它只是显示为相同的大小,但位于模拟器的顶部。
【解决方案2】:

你可以试试下面的代码:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
     let marginsAndInsets = inset * 2 + collectionView.safeAreaInsets.left + collectionView.safeAreaInsets.right + minimumInteritemSpacing * CGFloat(cellsPerRow - 1)

        //set inset, minimumInteritemSpacing and cellsPerRow globally

        let itemSize = ((collectionView.bounds.size.width - marginsAndInsets) / CGFloat(cellsPerRow)).rounded(.down)

        return CGSize(width: itemSize, height: itemSize)
    }
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
        //return UIEdgeInsets.zero
        return UIEdgeInsets(top: 0,left: 0,bottom: 0,right: 0);
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
        return 1
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
        return 1
    }

【讨论】:

    猜你喜欢
    • 2012-10-07
    • 2015-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-29
    • 1970-01-01
    • 1970-01-01
    • 2020-12-04
    相关资源
    最近更新 更多