как уменьшить вертикальный интервал в представлении UICollection

#ios #swift #uicollectionview #uicollectionviewcell

#iOS #swift #uicollectionview #uicollectionviewcell

Вопрос:

Я использую UICollectionView приведенный ниже мой код, как я могу убрать вертикальный интервал? Я попытался установить, UICollectionViewFlowLayout но ничего не получилось.

 class ViewController: UIViewController {
    
    @IBOutlet weak var cv: UICollectionView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        cv.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "cell")
        let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
        layout.scrollDirection = .vertical
        layout.sectionInset = UIEdgeInsets(top: 5, left: 5, bottom: 5, right: 5)
        let xx : CGFloat = (UIScreen.main.bounds.width / 8)
        let yy : CGFloat = 6.0
        layout.itemSize = CGSize(width: xx, height: yy)
        layout.minimumInteritemSpacing = 0
        layout.minimumLineSpacing = 1
        cv!.collectionViewLayout = layout
    }
}

extension ViewController: UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout {
    
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 70
    }
    
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath)
        if (indexPath.row/2 == 0) {
            cell.backgroundColor = UIColor.blue.withAlphaComponent(12)
        }
        else if (indexPath.row/4 == 0) {
            cell.backgroundColor = UIColor.blue.withAlphaComponent(0.5)
        }
        else{
            cell.backgroundColor = UIColor.blue.withAlphaComponent(0.1)
        }
        return cell
    }
}
 

введите описание изображения здесь

Ответ №1:

вы можете использовать UICollectionViewDelegateFlowLayout protcol и minimumInteritemSpacingForSectionAt / или minimumLineSpacingForSectionAt функции, подобные приведенному ниже коду:

 extension ViewController: UICollectionViewDelegateFlowLayout {
    
    public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
        return 10 // or any value
    }
    
    public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
        return 10 // or any value
    }
}
 

Ответ №2:

Интервал в вашем случае обусловлен шириной размера, в основном, каждого элемента.

Итак, у вас есть этот код для вычисления ширины вашего отдельного элемента:

 let xx : CGFloat = (UIScreen.main.bounds.width / 8)
 

Но поскольку у вас есть вставки разделов, ваш расчет должен измениться или вам придется удалить вставки, поэтому либо:

 let xx : CGFloat = (UIScreen.main.bounds.width - 10 / 8)
// 10 = 5 left   5 right is taken for section insets
 

Или удалите вставки разделов:

 // layout.sectionInset = UIEdgeInsets(top: 5, left: 5, bottom: 5, right: 5)
 

Если вы хотите указать начальную / конечную маржу, вместо этого используйте ограничения коллекции, т. Е. Ограничьте collectionView leadingAnchor / trailingAnchor его супервизора константой (скажем, 5), тогда вам не нужно выполнять вычисления, поскольку вы можете использовать метод sizeForItem делегирования и возвращать вычисления таким образом:

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