セルの選択時に、セルの外観の変更を処理したい。私はデリゲートメソッドを考え出しましたcollectionView:didSelectItemAtIndexPath:
&collectionView:didDeselectItemAtIndexPath:
セルを編集する必要がある場所です。
-(void)collectionView:(UICollectionView *)collectionView
didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
DatasetCell *datasetCell =
(DatasetCell *)[collectionView cellForItemAtIndexPath:indexPath];
[datasetCell replaceHeaderGradientWith:[UIColor skyBlueHeaderGradient]];
datasetCell.backgroundColor = [UIColor skyBlueColor];
}
と
-(void)collectionView:(UICollectionView *)collectionView
didDeselectItemAtIndexPath:(NSIndexPath *)indexPath {
DatasetCell *datasetCell =
(DatasetCell *)[collectionView cellForItemAtIndexPath:indexPath];
[datasetCell replaceHeaderGradientWith:[UIColor grayGradient]];
datasetCell.backgroundColor = [UIColor myDarkGrayColor];
}
セルが再利用される場合を除いて、これは正常に機能します。インデックス(0、0)のセルを選択すると、外観が変わりますが、下にスクロールすると、別のセルが選択された状態になります。
UICollectionViewCell
このメソッドを使用して、セルを再利用-(void)prepareForReuse
する準備をする (つまり、セルの外観を選択されていない状態に設定する) 必要があると思いますが、問題が生じます。
-(void)prepareForReuse {
if ( self.selected ) {
[self replaceHeaderGradientWith:[UIColor skyBlueHeaderGradient]];
self.backgroundColor = [UIColor skyBlueColor];
} else {
[self replaceHeaderGradientWith:[UIColor grayGradient]];
self.backgroundColor = [UIColor myDarkGrayColor];
}
}
一番上までスクロールすると、インデックス (0, 0) のセルが選択解除された状態になります。
cell.backgroundView プロパティを使用したばかりのとき、これを防ぐには次のようにしました。
-(void)prepareForReuse {
self.selected = FALSE;
}
選択状態は意図したとおりに機能しました。
何か案は?