我如何定制我UICollectionViewCell子类的选择状态?(How can I custo

2019-08-03 09:35发布

我有一个自定义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];
}

Answer 1:

添加的公共方法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照顾。 从文档:

选择所述小区和突出显示它的首选方法是使用集合视图对象的选择方法。



Answer 2:

在您的自定义UICollectionViewCell子类,你可以重写setSelected:像这样:

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

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

我发现,在反复触摸这个方法被调用,即使它已经选择了一个小区,所以你可能要核对一下你真的不想要射击之前的动画改变状态。



Answer 3:

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


Answer 4:

如果你想显示在选择动画,然后下面的方法可能对你有所帮助:

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


 }


Answer 5:

应国家不能乱覆盖在这样的时候:

override var isSelected: Bool {

    get {
        return super.isSelected
    }

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


文章来源: How can I customize the selection state of my UICollectionViewCell subclass?