web-dev-qa-db-ja.com

向きの変更時にUICollectionViewをアニメーション化する

横向きと縦向きのアイテム数とレイアウト(間隔)が異なる ICollectionView について考えてみます。

デバイスが回転したときにこれらの変更をアニメーション化するには、何をする必要がありますか? コレクションビュープログラミングガイド で回転の処理方法についての言及が見つかりませんでした。

15
hpique

コレクションビューのデータを再読み込みする必要はありません。[collectionView.collectionViewLayout invalidateLayout]を呼び出すと、コレクションビューのレイアウトが更新されます。

UICollectionViewLayoutサブクラスでshouldInvalidateLayoutForBoundsChange:をオーバーライドしてYESを返すと、コレクションビューの境界が変更されるたびに(サイズが変更されたときやユーザーがコンテンツをスクロールしたときを含む)、invalidateLayoutが自動的に呼び出されます。

41
titaniumdecoy

向きによってセクションの数が異なり、自動回転では変更されませんでした。データを再読み込みするには、collectionViewへの呼び出しを追加する必要がありました。私はUICollectionViewControllerを使用しています。他に何かがある場合は、独自のコレクションビュープロパティに調整してください。

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(    NSTimeInterval)duration {
    [super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
    [self.collectionView reloadData];
}
13

最も簡単な方法は、他のすべての答えを組み合わせることです。

viewControllerに次の行を追加するだけです。

override func willRotateToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) {
    self.mCollectionView.collectionViewLayout.invalidateLayout()
}

データをリロードする必要はありません。

5
CZ54

Swiftで次の簡単なコードを使用しました。

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
    collectionView.collectionViewLayout.invalidateLayout()
}
2
Antoine

ローテーションイベントで何かをしたいだけの場合は、このアプローチを使用しています。

- (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;
      }

横向きと縦向きで、または幅に応じて、たとえば望ましい動作をします。

以前の向きを保存し、それが変更されたかどうかを確認して、レイアウトを無効にするかどうかを決定することもできます。

これにより、ナビゲーションコントローラーに戻ったときにもサイズが更新されます。

1
Juanma Reyes