ビューをセットアップするためにinitWithFrame:
とlayoutSubviews
を上書きするカスタムUICollectionViewCellサブクラスがあります。しかし、私は今私が苦労している2つのことをやろうとしています。
1)選択時にUICollectionViewCell
の状態をカスタマイズしようとしています。たとえば、UIImageView
のUICollectionViewCell
にある画像の1つを変更したい。
2)UIImage
のUICollectionViewCell
をアニメート(ライトバウンス)したい。
誰かが私を正しい方向に向けることができますか?
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
MyCollectionViewCell *cell = (MyCollectionViewCell *)[collectionView cellForItemAtIndexPath:indexPath];
[cell setSelected:YES];
}
目的のperformSelectionAnimations
を変更し、目的のアニメーションを実行するパブリックメソッドMyCollectionViewCell
をUIImageView
の定義に追加します。次に、collectionView:didSelectItemAtIndexPath:
から呼び出します。
MyCollectionViewCell.mの場合:
- (void)performSelectionAnimations {
// Swap the UIImageView
...
// Light bounce animation
...
}
そして、あなたのUICollectionViewController
:
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
MyCollectionViewCell *cell = (MyCollectionViewCell *)[collectionView cellForItemAtIndexPath:indexPath];
[cell performSelectionAnimations];
}
[cell setSelected:YES]
への呼び出しを削除したことに注意してください。これは、UICollectionViewによって既に処理されている必要があるためです。ドキュメントから:
セルを選択して強調表示する好ましい方法は、コレクションビューオブジェクトの選択メソッドを使用することです。
カスタムUICollectionViewCellサブクラスでは、setSelected:
を次のようにオーバーライドできます。
- (void)setSelected:(BOOL)selected {
[super setSelected:selected];
if (selected) {
[self animateSelection];
} else {
[self animateDeselection];
}
}
繰り返しタッチすると、このメソッドは既に選択されている場合でもセルで呼び出されるため、不要なアニメーションを起動する前に実際に状態が変化していることを確認するだけでよいことがわかりました。
カスタムUICollectionViewCell
サブクラスでは、didSet
プロパティにisSelected
を実装できます。
スウィフト3:
override var isSelected: Bool {
didSet {
if isSelected {
// animate selection
} else {
// animate deselection
}
}
}
スイフト2:
override var selected: Bool {
didSet {
if self.selected {
// animate selection
} else {
// animate deselection
}
}
}
選択時にアニメーションを表示する場合は、次の方法が役立ちます。
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
NSLog(@"cell #%d was selected", indexPath.row);
// animate the cell user tapped on
UICollectionViewCell *cell = [collectionView cellForItemAtIndexPath:indexPath];
[UIView animateWithDuration:0.8
delay:0
options:(UIViewAnimationOptionAllowUserInteraction)
animations:^{
[cell setBackgroundColor:UIColorFromRGB(0x05668d)];
}
completion:^(BOOL finished){
[cell setBackgroundColor:[UIColor clearColor]];
}
];
}
この方法でオーバーライドされた場合、状態を混乱させないでください。
override var isSelected: Bool {
get {
return super.isSelected
}
set {
super.isSelected = newValue
.
.
.
}
}