29

我有一个自定义 UICollectionViewCell 子类,它覆盖initWithFrame:layoutSubviews设置其视图。但是,我现在正在尝试做两件我遇到麻烦的事情。

1)我正在尝试自定义UICollectionViewCell选择时的状态。例如,我想更改UIImageView.UICollectionViewCell

2)我想UIImageUICollectionViewCell.

谁能指出我正确的方向?

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

6 回答 6

68

在您的自定义UICollectionViewCell子类中,您可以didSetisSelected属性上实现。

斯威夫特 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
        }
    }
}
于 2015-05-11T17:57:32.097 回答
61

在您的自定义 UICollectionViewCell 子类中,您可以这样覆盖setSelected:

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

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

我发现在重复触摸时,即使它已经被选中,也会在单元格上调用此方法,因此您可能只想在触发不需要的动画之前检查您是否真的在改变状态。

于 2013-01-31T17:08:55.593 回答
15

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 应该已经处理了它。从文档中:

选择单元格并突出显示它的首选方法是使用集合视图对象的选择方法。

于 2012-12-01T09:34:12.167 回答
2

如果您想在选择时显示动画,那么以下方法可能对您有所帮助:

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


 }
于 2012-12-10T05:55:05.033 回答
0

以这种方式覆盖时不应与状态混淆:

override var isSelected: Bool {

    get {
        return super.isSelected
    }

    set {
        super.isSelected = newValue
        .
        .
        .
    }
}
于 2019-03-19T22:19:11.173 回答
0

From iOS 14, you can override updateConfiguration(using:) and update the cell according to the UICellConfigurationState.isSelected

于 2021-08-10T07:04:29.940 回答