Анимация UICollectionView при изменении ориентации
Рассмотрим UICollectionView, который имеет различное количество элементов и другой макет (то есть: интервал) в альбомной и портретной ориентации.
Что нужно сделать для того, чтобы эти изменения были анимированы, когда устройство повернуто? Я не мог найти никакого упоминания о том, как обрабатывать вращения в Руководство по программированию коллекций > .
Ответы
Ответ 1
Не нужно перезагружать данные представления коллекции. Вызов [collectionView.collectionViewLayout invalidateLayout]
заставит просмотр коллекции обновить его макет.
Переопределение shouldInvalidateLayoutForBoundsChange:
для возврата YES в подкласс UICollectionViewLayout приведет к тому, что invalidateLayout
будет вызываться автоматически всякий раз, когда изменяются ограничения просмотра коллекции (в том числе, когда изменяется его размер и когда пользователь прокручивает его содержимое).
Ответ 2
У меня было разное количество разделов на основе ориентации, и автоматическое вращение не изменило его. Мне пришлось добавить вызов коллекцииView для перезагрузки данных. Я использую UICollectionViewController, приспосабливаюсь к собственному свойству представления коллекции, если у вас есть что-то еще:
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:( NSTimeInterval)duration {
[super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
[self.collectionView reloadData];
}
Ответ 3
Самый быстрый способ - это сочетание всех других ответов.
просто добавьте следующие строки в ViewController:
override func willRotateToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) {
self.mCollectionView.collectionViewLayout.invalidateLayout()
}
Вам не нужно перезагружать данные.
Ответ 4
Я использую этот подход, если вы хотите что-то сделать только при событии поворота:
- (void)updateViewConstraints {
[super updateViewConstraints];
[[_cvMyCollectionView collectionViewLayout] invalidateLayout];
}
а затем переопределить метод из UICollectionViewDelegateFlowLayout
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
/*
* Calculate size, example
* */
CGSize cellSize = CGSizeMake(150.0f, 150.0f);
return cellSize;
}
с желаемым поведением в ландшафтном и портретном или в зависимости от ширины, например.
Вы даже можете сохранить предыдущую ориентацию и проверить, изменилось ли это, чтобы решить, следует ли отклонять макет или нет.
Это обновит размеры, даже если вы снова вернетесь в навигационном контроллере.
Ответ 5
В Swift я использовал следующий простой код:
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
collectionView.collectionViewLayout.invalidateLayout()
}