Почему ограничения не работают?

Портретный режим

введите здесь описание изображения

Ландшафтный режим

введите здесь описание изображения

Панель вкладок реализована с использованием UICollectionView (CV). В резюме я добавил 4 пункта:

addSubview(collectionTab)
addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[v0]|", options: NSLayoutFormatOptions(), metrics: nil, views: ["v0":collectionTab]))
addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[v0]|", options: NSLayoutFormatOptions(), metrics: nil, views: ["v0":collectionTab]))

Когда я меняю ориентацию, ограничения не работают. Почему? Как я могу это исправить? Я думаю, что размер элементов не пересчитывается, когда я меняю вид.

Размер предметов:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    return CGSize(width: frame.width/4, height: frame.height)
}

person maxim rad    schedule 17.11.2016    source источник
comment
размер элементов func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { return CGSize(width: frame.width/4, height: frame.height)}   -  person maxim rad    schedule 17.11.2016
comment
Что такое collectionTab? Это имя UICollectionView?   -  person Sajjon    schedule 17.11.2016
comment
Да, это вид коллекции   -  person maxim rad    schedule 17.11.2016


Ответы (1)


Попробуйте запустить invalidateLayout на UICollectionViewLayout на UICollectionView. Вот так

override func viewWillLayoutSubviews {
    myCollectionView.collectionViewLayout.invalidateLayout()
}
person Sajjon    schedule 17.11.2016
comment
Когда запускать эту функцию? - person maxim rad; 17.11.2016
comment
Просто реализуйте это в своем UIViewController, он вызывается автоматически - person Sajjon; 17.11.2016
comment
Я думаю, что размер элементов не пересчитывается, когда я меняю вид - person maxim rad; 17.11.2016
comment
вы внедряете collectionView(_:layout:sizeForItemAt:)? Вы должны рассчитать размер элемента там! - person Sajjon; 17.11.2016
comment
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { return CGSize(width: frame.width/4, height: frame.height)} - person maxim rad; 17.11.2016
comment
Можете ли вы убедиться, что CollectionView получает новый кадр после поворота? Пожалуйста, напечатайте ширину и высоту CollectionView до и после поворота внутри метода viewWillLayoutSubviews - person Sajjon; 17.11.2016
comment
@maximrad вы печатали кадры до и после поворота, каков результат? - person Sajjon; 17.11.2016
comment
Спасибо большое!! - person maxim rad; 17.11.2016
comment
переопределить функцию viewWillLayoutSubviews() { tabBar.collectionTab.collectionViewLayout.invalidateLayout() } - person maxim rad; 17.11.2016