Подтвердить что ты не робот

Как настроить состояние выбора моего подкласса UICollectionViewCell?

У меня есть пользовательский подкласс UICollectionViewCell, который перезаписывает initWithFrame: и layoutSubviews, чтобы настроить свои представления. Тем не менее, я сейчас пытаюсь сделать две вещи, с которыми у меня возникают проблемы.

1) Я пытаюсь настроить состояние UICollectionViewCell при выборе. Например, я хочу изменить одно из изображений в UIImageView в UICollectionViewCell.

2) Я хочу оживить (легкий отскок) UIImage в UICollectionViewCell.

Может ли кто-нибудь указать мне в правильном направлении?

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

Ответ 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. Из документации:

Предпочтительным способом выбора ячейки и ее выделения является использование методов выделения объекта представления коллекции.

Ответ 2

В вашем пользовательском подклассе UICollectionViewCell вы можете переопределить setSelected: так:

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

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

Я обнаружил, что при повторных касаниях этот метод вызывается в ячейке, даже если он уже выбран, поэтому вы можете просто проверить, что вы действительно меняете состояние, прежде чем запускать ненужные анимации.

Ответ 3

В вашем пользовательском подклассе UICollectionViewCell вы можете реализовать didSet в свойстве isSelected.

Swift 3:

override var isSelected: Bool {
    didSet {
        if isSelected {
            // animate selection
        } else {
            // animate deselection
        }
    }
}

Swift 2:

override var selected: Bool {
    didSet {
        if self.selected {
            // animate selection
        } else {
            // animate deselection
        }
    }
}

Ответ 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]];
                      }
      ];


 }