Как настроить состояние выбора моего подкласса 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];
}
Ответы
Ответ 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]];
}
];
}