UIStackView в скачке содержимого макета коллекции - PullRequest
0 голосов
/ 30 апреля 2019

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

enter image description here

Вот вид моих ограничений:

enter image description here

CollectionView настроен как:

let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
layout.sectionInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
layout.itemSize = CGSize(width: 60, height: 60)
layout.estimatedItemSize = CGSize(width: 1, height: 1)
collectionView = UICollectionView(frame: self.view.frame, collectionViewLayout: layout)
let nib = UINib(nibName: "SimpleStackCollectionViewCell", bundle: nil);
collectionView.register(nib, forCellWithReuseIdentifier: "MyCell")
collectionView?.dataSource = self
collectionView?.delegate = self

И я настроил UICollectionView как:

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

1 Ответ

2 голосов
/ 30 апреля 2019

Вы установили приблизительный размер в макете. Согласно документу:

open var estimatedItemSize: CGSize // defaults to CGSizeZero - setting a non-zero size enables cells that self-size via -preferredLayoutAttributesFittingAttributes:

Так что я предполагаю, что у вас есть изображение большего размера, чем у вашего UICollectionViewCell, и при прокрутке вы можете увидеть странное поведение. Чтобы избежать этого, просто удалите приблизительный размер параметра. Вам не нужно реализовывать sizeForItemAt ни того, ни другого. Таким образом, ваш код будет выглядеть как

let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
layout.sectionInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
layout.itemSize = CGSize(width: 60, height: 60)
collectionView = UICollectionView(frame: self.view.frame, collectionViewLayout: layout)
let nib = UINib(nibName: "SimpleStackCollectionViewCell", bundle: nil);
collectionView.register(nib, forCellWithReuseIdentifier: "MyCell")
collectionView?.dataSource = self
collectionView?.delegate = self

И, наконец, я не уверен, что вам нужно установить ограничения для вашего заполнителя UIImageView, если ваше представление стека уже установлено на alignment = .fill

Кроме того, вы можете заменить ограничение ширины на UIStackView на конечное ограничение.

И, возможно, вам нужно установить приоритет сопротивления вертикальному сжатию на UILabel, отличный от значения UIImageView.

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