横向きと縦向きのアイテム数とレイアウト(間隔)が異なる ICollectionView について考えてみます。
デバイスが回転したときにこれらの変更をアニメーション化するには、何をする必要がありますか? コレクションビュープログラミングガイド で回転の処理方法についての言及が見つかりませんでした。
コレクションビューのデータを再読み込みする必要はありません。[collectionView.collectionViewLayout invalidateLayout]
を呼び出すと、コレクションビューのレイアウトが更新されます。
UICollectionViewLayoutサブクラスでshouldInvalidateLayoutForBoundsChange:
をオーバーライドしてYESを返すと、コレクションビューの境界が変更されるたびに(サイズが変更されたときやユーザーがコンテンツをスクロールしたときを含む)、invalidateLayout
が自動的に呼び出されます。
向きによってセクションの数が異なり、自動回転では変更されませんでした。データを再読み込みするには、collectionViewへの呼び出しを追加する必要がありました。私はUICollectionViewControllerを使用しています。他に何かがある場合は、独自のコレクションビュープロパティに調整してください。
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:( NSTimeInterval)duration {
[super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
[self.collectionView reloadData];
}
最も簡単な方法は、他のすべての答えを組み合わせることです。
viewControllerに次の行を追加するだけです。
override func willRotateToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) {
self.mCollectionView.collectionViewLayout.invalidateLayout()
}
データをリロードする必要はありません。
Swiftで次の簡単なコードを使用しました。
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
collectionView.collectionViewLayout.invalidateLayout()
}
ローテーションイベントで何かをしたいだけの場合は、このアプローチを使用しています。
- (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;
}
横向きと縦向きで、または幅に応じて、たとえば望ましい動作をします。
以前の向きを保存し、それが変更されたかどうかを確認して、レイアウトを無効にするかどうかを決定することもできます。
これにより、ナビゲーションコントローラーに戻ったときにもサイズが更新されます。