Контент ячейки не отображается в UICollectionView - PullRequest
0 голосов
/ 12 июня 2019

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

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

В отдельном классе:

extension UIView{

func addConstraintsWithFormat(format: String, views: UIView...){

    var viewsDictionary = [String:UIView]()
    for (index, view) in views.enumerated(){
        let key = "v\(index)"
        view.translatesAutoresizingMaskIntoConstraints = false
        viewsDictionary[key] = view
    }

    addConstraints(NSLayoutConstraint.constraints(withVisualFormat: format, options: NSLayoutConstraint.FormatOptions(), metrics: nil, views: viewsDictionary))
    }
}

extension UIColor {
static func rgb(r: CGFloat, g: CGFloat, b: CGFloat, a:CGFloat) -> UIColor{
    return UIColor(red: r/255, green: b/255, blue: g/255, alpha: a)
    }
}

В классе ViewController:

override func viewDidLoad() {
        super.viewDidLoad() 
        setupMenuBar()
    }


    let menuBar: MenuBar = {
        let mb = MenuBar()
        return mb
    }()

    private func setupMenuBar() {
        view.addSubview(menuBar)
        view.addConstraintsWithFormat(format: "H:|[v0]|", views: menuBar)
        view.addConstraintsWithFormat(format: "V:|[v0(60)]", views: menuBar)
    }

В созданном классе для представлений:

class MenuBar: UIView, UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout {

    lazy var collectionView: UICollectionView = {
        let layout = UICollectionViewLayout()
        let cv = UICollectionView(frame: .zero, collectionViewLayout: layout)
        cv.backgroundColor = UIColor.rgb(r: 230, g: 32, b: 31, a: 1) 
        cv.dataSource = self
        cv.delegate = self
        return cv
    }()


    let cellId = "cellId"

    override init(frame: CGRect) {
        super.init(frame: frame)

        collectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: cellId)

        addSubview(collectionView)
        addConstraintsWithFormat(format: "H:|[v0]|", views: collectionView)
        addConstraintsWithFormat(format: "V:|[v0]|", views: collectionView)
   }

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return 5
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath)

        cell.backgroundColor = UIColor.blue

        return cell
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

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

1 Ответ

1 голос
/ 12 июня 2019

Ваша проблема не в рамке представления коллекции, поскольку она решается с помощью использования ограничений.Проблема с этой строкой:

let layout = UICollectionViewLayout()

Из документации UICollectionViewLayout это:

Абстрактный базовый класс для генерации информации макета для представления коллекции

Таким образом, сам по себе он не предоставляет правильную информацию о макете, и вы должны использовать его подкласс для предоставления правильной информации о макете.

Одним из примеров этого является UICollectionViewFlowLayout, который позволяет макетироватьячейки в базовом формате сетки.

Если вы замените вышеприведенную строку на эту, то вы увидите ячейки:

let layout = UICollectionViewFlowLayout()

Затем вы можете изменить параметры, которые предоставляет класс, или создать свойсобственный подкласс UICollectionViewLayout с подробностями требуемого макета.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...