简体   繁体   中英

How to set no spacing in UICollectionViewDelegateFlowLayout?

I'm trying to do a UICollectionViewDelegateFlowLayout with 3 items to a row at a third of the screen width. For some reason it's adding spacing and not conforming to the square layout.

Here are the UICollectionViewDelegateFlowLayout functions.

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
    }

Please do not suggest adding a layout to a collection view in the viewDidLoad method. I tried that and it didn't work because it deletes my header.

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)
}



}

You can also try:

 override func viewDidLoad() {
    super.viewDidLoad()

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

 }

You can try with following code:

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
    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM