Невозможно получить простую ячейку представления коллекции с самоизмерением размера, чтобы пометить ее с помощью автоматического определения расположения - PullRequest
0 голосов
/ 22 апреля 2019

Xcode 10.2, Swift 5.

У меня есть UICollectionViewCell, определенный в .xib файле. Я загружаю это в мой UIViewController (не UICollectionViewController) подкласс и возвращаю его в cellForItemAt.

В моем UICollectionViewCell (называемом TagCell) я делаю это:

    override
    func
    awakeFromNib()
    {
        super.awakeFromNib()

        self.contentView.translatesAutoresizingMaskIntoConstraints = false
        self.translatesAutoresizingMaskIntoConstraints = false

        self.layer.borderColor = UIColor(red: 0.354, green: 0.442, blue: 0.297, alpha: 0.74).cgColor
        self.layer.borderWidth = 1.0
        self.layer.cornerRadius = 4.0
    }

У пера есть только верхний уровень UICollectionViewCell, который я поместил, и UILabel с фиксированными 4-пиксельными ограничениями на все четыре ребра. Я установил текст UILabel в cellForItemAt. Однако итоговая коллекция отображается со всеми ячейками на предполагаемой высоте, установленной в viewDidLoad():

    override
    func
    viewDidLoad()
    {
        super.viewDidLoad()

        let nib = UINib(nibName: "TagCell", bundle: Bundle(for: type(of: self)))
        self.collectionView.register(nib, forCellWithReuseIdentifier: "TagCell")

        let layout = self.collectionView.collectionViewLayout as! UICollectionViewFlowLayout
        layout.estimatedItemSize = CGSize(width: 60.0, height: 25.0)
}

Файл Nib ячейки:

Cell Nib Screenshot

Кажется, это все, что Apple и другие ресурсы, которые я нашел в Интернете, говорят мне, но я, должно быть, упускаю что-то важное Я также попытался установить приоритет сопротивления горизонтального сжатия на 1000 на моем UILabel, но они продолжают усекаться.

Я также пытался ввести ограничение ширины >=, но это, кажется, игнорируется.

Прежде чем установить self.contentView.translatesAutoresizingMaskIntoConstraints, я получу предупреждение о конфликтующих ограничениях в отладчике. Но теперь он не жалуется на ограничение ширины >=, даже думая, что он его нарушает.

1 Ответ

0 голосов
/ 22 апреля 2019

Итак, получается, что необходимо сделать в клетке awakeFromNib() следующее:

        self.contentView.translatesAutoresizingMaskIntoConstraints = false
        let fixupConsts =
        [
            self.contentView.leftAnchor.constraint(equalTo: self.leftAnchor),
            self.contentView.rightAnchor.constraint(equalTo: self.rightAnchor),
            self.contentView.topAnchor.constraint(equalTo: self.topAnchor),
            self.contentView.bottomAnchor.constraint(equalTo: self.bottomAnchor)
        ]
        NSLayoutConstraint.activate(fixupConsts)

Несмотря на то, что WWDC 2014 Session 226 очень явно заявляет, что единственное, что вам нужно сделать, это установить estimatedCellSize в ненулевое значение, этого просто недостаточно.

Если кто-нибудь может дать лучший ответ, я с радостью отмечу его как ответ.

...