UICollectionView не отображается для просмотра - PullRequest
0 голосов
/ 24 ноября 2018

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

просмотр контроллера:

class UARTModuleViewController: UIViewController, CBPeripheralManagerDelegate, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {
    override func viewDidLoad() {
        super.viewDidLoad()
        setupMenuBar()
    }

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

    private func setupMenuBar() {
        view.addSubview(menuBar)
        let horizontalConstraint = NSLayoutConstraint.constraints(withVisualFormat: "H:|[v0]|", options: NSLayoutFormatOptions(), metrics: nil, views: ["v0":menuBar])
        let verticalConstraint = NSLayoutConstraint.constraints(withVisualFormat: "V:|[v0(100)]|", options: NSLayoutFormatOptions(), metrics: nil, views: ["v0":menuBar])
        view.addConstraints(horizontalConstraint)
        view.addConstraints(verticalConstraint)
    }
}

MenuBar.swift:

class MenuBar : UIView, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {

    lazy var collectionView : UICollectionView = {
        let layout = UICollectionViewFlowLayout()
        let cv = UICollectionView(frame: .zero, collectionViewLayout: layout)
        cv.backgroundColor = UIColor.red
        cv.dataSource = self
        cv.delegate = self
        return cv
    }()

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

        self.addSubview(collectionView)
        collectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "MenuCell")

        //took out constraints here just to make the warning mentioned below easier to follow.
    }

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

[LayoutConstraints] Невозможно одновременно удовлетворить ограничения.

Я пробовал рассуждать через это и не могукажется, пришли к решению.У меня также есть класс ячейки, но я подумал, что включать его не нужно, поскольку я не могу отобразить UICollectionView.Единственное, что я могу добавить, это то, что у меня есть UIImageView в середине представления, которое я добавил в раскадровку, и наложил ограничения следующим образом: enter image description here

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

1 Ответ

0 голосов
/ 24 ноября 2018

Согласно комментариям:

  • Прежде всего, каждый раз, когда вы используете ограничение в коде, вы должны установить translatesAutoresizingMaskIntoConstraints = false для представления, для которого вы хотите добавить ограничение.
  • Вы не говорите представлению коллекции заполнить все пространство MenuBar.
  • Ограничения, примененные к MenuBar в setupMenuBar, не позволяют определить размер и положение представления.

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

private func setupMenuBar() {
    view.addSubview(menuBar)
    menuBar.translatesAutoresizingMaskIntoConstraints = false // this will make your constraint working
    menuBar.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor).isActive = true // every constraint must be enabled.
    menuBar.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor).isActive = true
    menuBar.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor).isActive = true
    menuBar.heightAnchor.constraint(equalToConstant: 60).isActive = true
}

Чтобы сообщитьпредставление коллекции, чтобы заполнить все представление MenuBar, делает это в MenuBar init(frame:) методе:

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

    self.addSubview(collectionView)
    collectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "MenuCell")

    collectionView.translatesAutoresizingMaskIntoConstraints = false        
    collectionView.topAnchor.constraint(equalTo: topAnchor).isActive = true
    collectionView.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true
    collectionView.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true
    collectionView.trailingAnchor.constraint(equalTo: trailingAnchor).isActive = true

    //took out constraints here just to make the warning mentioned below easier to follow.
}

Как вы можете видеть в моем коде, я обычно использую «якорные» методы для применения ограничения, потому чтопроще, чем визуальный формат.

...