Я использую UICollectionView
с UICollectionViewFlowLayout
.
Я устанавливаю размер каждой ячейки через
collectionView:layout:sizeForItemAtIndexPath:
При переключении с портретной на альбомную ориентацию я хотел бы настроить размер каждой ячейки, чтобы полностью соответствовать размеру CollectionView, не оставляя отступов между ячейками.
Вопросы:
1) Как изменить размер ячейки после события вращения?
2) А еще лучше, как сделать макет, при котором ячейки всегда умещались на весь размер экрана?
ios
uicollectionview
uicollectionviewcell
Фмессина
источник
источник
sizeForItemAtIndexPath
перед вызовомdidRotateFromInterfaceOrientation
. Однако для представления коллекции с несколькими ячейками на экране недействительность макета перед поворотом вызывает неприятный, видимый скачок в размере перед поворотом представления. В этом случае я считаю, что мой ответ по-прежнему является наиболее правильной реализацией.I would like to adjust the size of each cell to **completely fit the size of the CollectionView**
какое именно решение было предложено в моем ответе. Если бы вы могли включить мое решение в свой ответ и отметить, какой подход работает лучше всего, в каких условиях этого было бы достаточно для меня.Ответы:
1) Вы можете поддерживать и менять несколько объектов макета, но есть более простой способ. Просто добавьте следующее в свой
UICollectionViewController
подкласс и отрегулируйте размеры по мере необходимости:Вызов
-performBatchUpdates:completion:
аннулирует макет и изменяет размер ячеек с помощью анимации (вы можете просто передать nil обоим параметрам блока, если у вас нет дополнительных настроек для выполнения).2) Вместо жесткого кодирования размеров элементов в
-collectionView:layout:sizeForItemAtIndexPath
, просто разделите высоту или ширину границ collectionView на количество ячеек, которые вы хотите разместить на экране. Используйте высоту, если ваш collectionView прокручивается по горизонтали, или ширину, если он прокручивается по вертикали.источник
[self.collectionView.collectionViewLayout invalidateLayout];
?invalidateLayout
будет перерисовывать ячейки с правильным размером, но-performBatchUpdates:completion:
анимирует изменения, что выглядит намного лучше IMHO.didRotateFromInterfaceOrientation
устарело в iOS 8coordinator.animateAlongsideTransition
вviewWillTransitionToSize
и вызываяperformBatchUpdates
в своемanimation
блоке. Это дает хороший анимационный эффект.Если вам не нужна дополнительная анимация
performBatchUpdates:completion:
, просто используйтеinvalidateLayout
для принудительной перезагрузки collectionViewLayout.источник
Я решил использовать два UICollectionViewFlowLayout. Один для портрета и один для пейзажа. Я назначаю их своей коллекцииView динамически в -viewDidLoad
Затем я просто изменил свои методы collectionViewFlowLayoutDelgate следующим образом
Последний раз я переключаюсь с одного макета на другой при ротации
источник
Есть простой способ установить размер ячейки представления коллекции:
Не уверен, что это можно анимировать.
источник
Swift: ячейка представления коллекции, которая составляет n% высоты экрана
Мне нужна была ячейка, которая составляла определенный процент от высоты просмотра и меняла размер при повороте устройства.
С помощью сверху вот решение
источник
Если вы используете.
autolayout
Вам просто нужноinvalidate layout
в контроллере представления при повороте и настройкеoffset
в подклассе макета потока.Итак, в вашем контроллере представления -
И в твоем
FlowLayout Subclass
источник
willRotateToInterfaceOrientation
устарела в iOS 8, ноviewWillTransitionToSize
работает и для этого.