Appleのドキュメント(およびWWDC 2012で宣伝されている)によると、レイアウトをUICollectionView
動的に設定し、変更をアニメーション化することも可能です。
通常、コレクションビューを作成するときにレイアウトオブジェクトを指定しますが、コレクションビューのレイアウトを動的に変更することもできます。レイアウトオブジェクトは、collectionViewLayoutプロパティに保存されます。このプロパティを設定すると、変更をアニメーション化せずに、レイアウトがすぐに直接更新されます。変更をアニメーション化する場合は、代わりにsetCollectionViewLayout:animated:メソッドを呼び出す必要があります。
ただし、実際には、に説明UICollectionView
できない、さらには無効な変更が加えられ、contentOffset
セルが正しく移動せず、機能が実質的に使用できなくなることがわかりました。この問題を説明するために、ストーリーボードにドロップされたデフォルトのコレクションビューコントローラーにアタッチできる次のサンプルコードをまとめました。
#import <UIKit/UIKit.h>
@interface MyCollectionViewController : UICollectionViewController
@end
@implementation MyCollectionViewController
- (void)viewDidLoad
{
[super viewDidLoad];
[self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"CELL"];
self.collectionView.collectionViewLayout = [[UICollectionViewFlowLayout alloc] init];
}
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
return 1;
}
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
UICollectionViewCell *cell = [self.collectionView dequeueReusableCellWithReuseIdentifier:@"CELL" forIndexPath:indexPath];
cell.backgroundColor = [UIColor whiteColor];
return cell;
}
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
NSLog(@"contentOffset=(%f, %f)", self.collectionView.contentOffset.x, self.collectionView.contentOffset.y);
[self.collectionView setCollectionViewLayout:[[UICollectionViewFlowLayout alloc] init] animated:YES];
NSLog(@"contentOffset=(%f, %f)", self.collectionView.contentOffset.x, self.collectionView.contentOffset.y);
}
@end
コントローラはデフォルトUICollectionViewFlowLayout
をに設定しviewDidLoad
、画面に単一のセルを表示します。セルが選択されると、コントローラーは別のデフォルトを作成し、フラグUICollectionViewFlowLayout
を使用してコレクションビューに設定します。animated:YES
予想される動作は、セルが移動しないことです。ただし、実際の動作では、セルは画面外にスクロールします。その時点では、セルを画面上にスクロールして戻すことさえできません。
コンソールログを見ると、contentOffsetが不可解に変更されていることがわかります(私のプロジェクトでは、(0、0)から(0、205)に)。アニメーション化されていないケース( )の解決策の解決策を投稿しましたi.e. animated:NO
が、アニメーションが必要なので、アニメーション化されたケースの解決策や回避策があるかどうかを知りたいと思っています。
補足として、私はカスタムレイアウトをテストし、同じ動作をしました。