Как установить без интервала в UICollectionViewDelegateFlowLayout?

Я пытаюсь сделать UICollectionViewDelegateFlowLayout с 3 элементами в строке на треть ширины экрана. По какой-то причине он добавляет интервал и не соответствует квадратному макету.

Вот функции 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. Я пробовал это, и это не сработало, потому что он удаляет мой заголовок.


person Nick Steen    schedule 26.12.2019    source источник
comment
(коллекцияView.bounds.width - 2) / 3.0 Я думаю, что это формула для расчета 1/3 ширины с расстоянием между ячейками всего в 1 пиксель.   -  person Aqeel Ahmad    schedule 27.12.2019
comment
Можете ли вы сказать мне свою версию xcode?   -  person Aqeel Ahmad    schedule 27.12.2019


Ответы (2)


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

 }
person Celeste    schedule 26.12.2019
comment
первый не работает. есть ли еще код для второго? также, если я использую второй, который, кажется, удаляет мой заголовок. как я могу сохранить заголовок при использовании второго? - person Nick Steen; 27.12.2019
comment
Как вы установили размер заголовка? Я отредактировал свой ответ, вы можете добавить: layout?.headerReferenceSize = .init() - person Celeste; 27.12.2019
comment
Я установил размер заголовка в раскадровке. это все еще не работает после правок. он просто отображается того же размера, но в верхней части симулятора. - person Nick Steen; 27.12.2019

Вы можете попробовать следующий код:

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
    }
person Kishan Bhatiya    schedule 27.12.2019