Если вы используете Autolayout на раскадровке , вы должны активировать опцию «Follow Readable Width» для суперпредставления. Сначала убедитесь, что представление коллекции прикреплено к полям суперпредставления. Затем go для суперпредставления и откройте инспектор размера и выберите опцию:

Спасибо, Мэтт за ответ .
Для программирования c Autolayout вам не нужны поля, просто присоедините представление коллекции к readableContentGuide
суперпредставления. Например:
let cv = collectionView
// Guide of the superview
let readableGuide = view.readableContentGuide
NSLayoutConstraint.activateConstraints([
cv.topAnchor.constraintEqualToAnchor(readableGuide.topAnchor),
cv.bottomAnchor.constraintEqualToAnchor(readableGuide.bottomAnchor),
cv.rightAnchor.constraintEqualToAnchor(readableGuide.rightAnchor),
cv.leftAnchor.constraintEqualToAnchor(readableGuide.leftAnchor)
])
Если вы предпочитаете основанную на кадрах программу c layout , вам не нужно использовать layoutMarginsDidChange
, traitCollectionDidChange
суперпредставления, ни наблюдать bounds
. Лучшее место для разметки кода - viewWillLayoutSubviews()
прикол c контроллера. Это будет обрабатывать любые изменения границ, включая повороты интерфейса.
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
collectionView.frame = view.readableContentGuide.layoutFrame
collectionView.collectionViewLayout.invalidateLayout()
}
Здесь Я объясняю, почему нам нужно invalidateLayout()
.