UICollectionViewCellでは作成時にsubviewの位置の変更が出来ない


表題の問題にぶつかりました。UICollectionViewのCellでセル自体のレイアウトがセルごとに一部のパーツの位置が変わるものを作っていました。UI要素は変わらずレイアウトだけ違うので、同じクラスにしたいと思い、UICollectionViewDatasourceのcellForItemAtIndexPathでsubviewの位置を変えたところ反映されず、もう一度表示されるときにはsubviewの位置が変わっているということが起きました。

解決手法

いろいろやっていたのですが、結局同じクラスで違うxibを使うことで実現出来ました。viewDidLoadでregisterNibをそれぞれのxibと別のIdentifierを与えて複数回呼び出すことで、クラスは変えずにレイアウトだけ違うセルを表示させることが出来るというわけです。コードとしてはこんな感じですね。

UINib *itemNib1 = [UINib nibWithNibName:@"Cell1" bundle:nil];
[self.collectionView registerNib:itemNibL forCellWithReuseIdentifier:@"ItemCell1"];
UINib *itemNib1 = [UINib nibWithNibName:@"Cell2" bundle:nil];
[self.collectionView registerNib:itemNibR forCellWithReuseIdentifier:@"ItemCell2"];

補足

そもそもUICollectionViewなのだから、別クラスのセルにすればええやんという考えもあったんですが、ほぼ同じ実装を持つのもなぁということで上記の手法を取りました。

この記事に対してコメントを書く