如何自定义UICollectionViewCell子类的选择状态?

时间:2012-12-01 08:50:34

标签: iphone objective-c ios uicollectionview uicollectionviewcell

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

1)我正在尝试在选择时自定义UICollectionViewCell的状态。例如,我想更改UIImageViewUICollectionViewCell中的一个图片。

2)我想为UIImage中的UICollectionViewCell设置动画(灯光反弹)。

有人能指出我正确的方向吗?

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

6 个答案:

答案 0 :(得分:57)

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

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

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

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

答案 1 :(得分:53)

在自定义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
        }
    }
}

答案 2 :(得分:17)

将公共方法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应该已经处理了这个调用。来自文档:

  

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

答案 3 :(得分: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]];
                      }
      ];


 }

答案 4 :(得分:0)

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

BufferedReader reader = new BufferedReader(new FileReader("file.txt"));
int lines = 0;
while (reader.readLine() != null) lines++;
reader.close();

答案 5 :(得分:0)

从 iOS 14 开始,您可以根据 updateConfiguration(using:) 覆盖 UICellConfigurationState.isSelected 并更新单元格