невозможно спроектировать uicollectionview так, как я хочу

#swift #uicollectionview #uicollectionviewlayout

#swift #uicollectionview #uicollectionviewlayout

Вопрос:

не может быть 3 ячеек для строки с этим CollectionView.

  • добавлен UICollectionView через раскадровку, то же самое для ячейки, затем добавлены ограничения. Все остальное делается с помощью кода.
  • если я оставлю ячейку пустой, они будут идеально квадратными, но на iPhone 11 они равны 6 для строки
  • если добавить несколько выходов, например, изображение и метку в стек (закрепленные 0,0,00 файла, заполнить), они распределяются неравномерно
  • что-то изменится, если я введу ограничения с помощью кода в ячейке для изображения, но результат никогда не будет таким, как я ожидаю, по 3 ячейки в строке.
  • оба метода терпят неудачу

мой контроллер

 import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var myCollectionView: UICollectionView!
    
    var collectionData = ["1🐶", "2🐱", "3 🐼", "4🐯", "5🐙", "6🦕", "7🦖", "8🦀", "9🐬", "10🦋", "11🐠", "12🦇"]

    override func viewDidLoad() {
        super.viewDidLoad()
        
        myCollectionView.delegate = self
        myCollectionView.dataSource = self
        configureCollectionView()
    }
    
    
    private func configureCollectionView() {
        
        let widthOfScreen = (view.frame.size.width - 20) / 3
        let layout = myCollectionView.collectionViewLayout as! UICollectionViewFlowLayout
        layout.itemSize = CGSize(width: widthOfScreen , height: widthOfScreen )
        layout.sectionInset =  UIEdgeInsets(top: 40.0,
                                            left: 10.0,
                                            bottom: 40.0,
                                            right: 10.0)
    }
    
    
    
    private func configureCollectionView2() {
        let width = view.bounds.width
        let padding: CGFloat = 12
        let minimumItemSpacing: CGFloat = 10
        let availableWidth = width - (padding * 2) - (minimumItemSpacing * 2)
        let itemWidth = availableWidth / 3
        
        let layout = myCollectionView.collectionViewLayout as! UICollectionViewFlowLayout
        layout.sectionInset =  UIEdgeInsets(top: padding,
                                            left: padding,
                                            bottom: padding,
                                            right: padding)
        layout.itemSize = CGSize(width: itemWidth, height: itemWidth)
    }
    
    
    
    
}


extension ViewController: UICollectionViewDelegate {
    
    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        print(self.collectionData[indexPath.item])
    }
    
}

extension ViewController: UICollectionViewDataSource {

    
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return collectionData.count
    }
    
    
    
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

        let model = collectionData[indexPath.item]
        let cell = myCollectionView.dequeueReusableCell(withReuseIdentifier: MyCollectionViewCell.reuseId, for: indexPath) as! MyCollectionViewCell
        cell.configure(with: model)
        
        return cell
    }
    
    
}
  

моя ячейка

 import UIKit

class MyCollectionViewCell: UICollectionViewCell {
    
    static let reuseId = "MyCollectionViewCell"
    
//    @IBOutlet weak var myCellImage: UIImageView!
//    @IBOutlet weak var myCellLabel: UILabel!
    
    
    func configure(with: String) {
        
        backgroundColor = .systemPink
//        myCellImage.backgroundColor = .black
        
//        myCellImage.translatesAutoresizingMaskIntoConstraints = false
//
//        NSLayoutConstraint.activate([
//
//            myCellImage.widthAnchor.constraint(equalToConstant: 50),
//            myCellImage.heightAnchor.constraint(equalToConstant: 50),
//
//        ])

        
    }
    
    
    
    
}
  

Ответ №1:

  • Для случаев, когда ячейка пуста: вам нужно добавить некоторый интервал между ячейками, чтобы у вас могло быть 3 ячейки подряд; самый простой способ сделать это — использовать инспектор размера представления коллекции в разделе минимальный интервал, ячейка предназначена для горизонтального интервала, а строка — для вертикального интервала.
  • И при добавлении торговых точек: один из способов сделать это — установить высоту и ширину хотя бы одного из этих торговых точек.

PS Вам нужно добавить интервал в обоих сценариях.

Комментарии:

1. но, делая это в коде, я добавил minimumItemSpacing, вы говорите о чем-то другом?

2. Да, я только что это видел, но я полагаю, что вы присвоили это значение размеру ячеек, а не расстоянию между ячейками.