web-dev-qa-db-ja.com

UICollectionViewCellサブクラスの選択状態をカスタマイズするにはどうすればよいですか?

ビューをセットアップするためにinitWithFrame:layoutSubviewsを上書きするカスタムUICollectionViewCellサブクラスがあります。しかし、私は今私が苦労している2つのことをやろうとしています。

1)選択時にUICollectionViewCellの状態をカスタマイズしようとしています。たとえば、UIImageViewUICollectionViewCellにある画像の1つを変更したい。

2)UIImageUICollectionViewCellをアニメート(ライトバウンス)したい。

誰かが私を正しい方向に向けることができますか?

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
    MyCollectionViewCell *cell = (MyCollectionViewCell *)[collectionView cellForItemAtIndexPath:indexPath];
    [cell setSelected:YES];
}
26
user594161

目的のperformSelectionAnimationsを変更し、目的のアニメーションを実行するパブリックメソッドMyCollectionViewCellUIImageViewの定義に追加します。次に、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によって既に処理されている必要があるためです。ドキュメントから:

セルを選択して強調表示する好ましい方法は、コレクションビューオブジェクトの選択メソッドを使用することです。

17
Jonathan

カスタムUICollectionViewCellサブクラスでは、setSelected:を次のようにオーバーライドできます。

- (void)setSelected:(BOOL)selected {
    [super setSelected:selected];

    if (selected) {
        [self animateSelection];
    } else {
        [self animateDeselection];
    }
}

繰り返しタッチすると、このメソッドは既に選択されている場合でもセルで呼び出されるため、不要なアニメーションを起動する前に実際に状態が変化していることを確認するだけでよいことがわかりました。

57
thomh

カスタム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
        }
    }
}
55
Mike Sprague

選択時にアニメーションを表示する場合は、次の方法が役立ちます。

 - (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]];
                      }
      ];


 }
2
Gaurav

この方法でオーバーライドされた場合、状態を混乱させないでください。

override var isSelected: Bool {

    get {
        return super.isSelected
    }

    set {
        super.isSelected = newValue
        .
        .
        .
    }
}
0
Hardcoded