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

26 iphone objective-c ios uicollectionview uicollectionviewcell

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

1)我正在尝试自定义UICollectionViewCell选择的状态.例如,我想改变图像的一个在UIImageViewUICollectionViewCell.

2)I要动画(光反弹)的UIImageUICollectionViewCell.

谁能指出我正确的方向?

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

小智 58

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

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

    if (selected) {
        [self animateSelection];
    } else {
        [self animateDeselection];
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 这是一种错误的方法,因为在重新加载时你会得到错误的动画. (8认同)

Mik*_*gue 57

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

斯威夫特3:

override var isSelected: Bool {
    didSet {
        if isSelected {
            // animate selection
        } else {
            // animate deselection
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

斯威夫特2:

override var selected: Bool {
    didSet {
        if self.selected {
            // animate selection
        } else {
            // animate deselection
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这不是推荐的方法。它会(确实)引起很多问题,尤其是在处理单元格的选择和突出显示时。如Apple的文档所述,最好对UICollectionView子类中的选择和突出显示做出响应,而不是对单元格做出响应。这样,您的UICollectionViewCell便负责维护和指示状态。不是细胞。因此,您应该响应“ collectionView(_ collectionView :, didSelectItemAt indexPath :)”,获取单元格(或collectionView.visibleCells)并在那里设置状态和动画。干杯。 (2认同)

Jon*_*han 17

将一个公共方法添加performSelectionAnimationsMyCollectionViewCell更改所需的定义UIImageView并执行所需的动画.然后从中调用它collectionView:didSelectItemAtIndexPath:.

所以在MyCollectionViewCell.m中:

- (void)performSelectionAnimations {
    // Swap the UIImageView
    ...

    // Light bounce animation
    ...
}
Run Code Online (Sandbox Code Playgroud)

在你的UICollectionViewController:

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
    MyCollectionViewCell *cell = (MyCollectionViewCell *)[collectionView cellForItemAtIndexPath:indexPath];
    [cell performSelectionAnimations];
}
Run Code Online (Sandbox Code Playgroud)

注意我已经取消了调用[cell setSelected:YES],因为UICollectionView已经应该处理了这个调用.从文档:

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

  • 这个解决方案完全错了.至少是因为单元格对象被重复使用,并且在滚动时最终会显示错误的单元格. (7认同)