コレクションビューの境界に基づいてアイテムのサイズが設定されたコレクションビューを実装しています。したがって、たとえば、デバイスを回転させるためにサイズが変更された場合、レイアウトを無効にして、新しいコレクションビューの境界を考慮してセルのサイズを変更する必要があります。私はこれをviewWillTransitionToSize
API経由で行っています。サイズ変更時にコレクションビューレイアウトを無効にする適切な方法
これは、ユーザーがコレクションビューを含むビューコントローラ上にモーダルビューコントローラを表示し、デバイスを回転してから閉じてしまうまで機能します。これが発生すると、アイテムのサイズが適切なサイズに更新されませんでした。 viewWillTransitionToSize
が呼び出され、レイアウトは期待どおりに無効化されますが、コレクションビューの境界は依然として古い値です。たとえば、ポートレートからランドスケープに回転するとき、コレクションビューの境界値の高さは、幅よりも大きくなります。なぜそれが当てはまるのか分かりませんが、これがサイズ変更を無効にする最良の方法であるかどうか疑問です。それを行うより良い方法はありますか?
私もUICollectionViewFlowLayout
をサブクラス化しYES
を返すためにshouldInvalidateLayoutForBoundsChange
を上書きしようとしたが、何らかの理由で、これはさえモーダルプレゼンテーションせずに回転動作しません。適切なコレクションビュー境界を使用しません。
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(nonnull id<UIViewControllerTransitionCoordinator>)coordinator
{
[super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
[self.collectionView.collectionViewLayout invalidateLayout];
[coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> __nonnull context) {
[self.collectionView.collectionViewLayout invalidateLayout];
} completion:^(id<UIViewControllerTransitionCoordinatorContext> __nonnull context) {
//finished
}];
}
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewFlowLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
//collectionView.bounds.size is not always correct here after invalidating layout as explained above
}
は、私はまた、完了ブロックでそれをinvaliding試してみたが、それはまだ適切なコレクションビューの境界を使用していません。
viewWillAppear
で再度レイアウトを無効にすると、適切なコレクションビュー境界が使用され、モーダルに表示されたビューコントローラで回転する問題が解決されます。しかし、これは必要ではないはずです。おそらく、これが適切にサイズ調整されない他の状況があります。
http://stackoverflow.com/questions/29023473/uicollectionview-invalidate-layout-on-bounds-changesを見ましたか? – ozgur
@ozgur私はすでに、その答えにあるものを試しました。上記で説明した通りです。 – Joey
'viewWillAppear()'で何も更新していませんか? modal viewコントローラが閉じられているときに、上記のシナリオ(モーダルコントローラが終了している間に向きを変える)では、 'viewWillAppear()'に* previous *の向きのフレームを取得し、 'viewDidAppear() '。ですから、私にとっては通常、 'viewWillTransitionToSize'でレイアウトを更新するだけです。 –