Анимация UICollectionView при изменении ориентации - программирование
Подтвердить что ты не робот

Анимация UICollectionView при изменении ориентации

Рассмотрим UICollectionView, который имеет различное количество элементов и другой макет (то есть: интервал) в альбомной и портретной ориентации.

Что нужно сделать для того, чтобы эти изменения были анимированы, когда устройство повернуто? Я не мог найти никакого упоминания о том, как обрабатывать вращения в Руководство по программированию коллекций > .

4b9b3361

Ответ 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()
}