iphone - volver - ¿Cómo puedo personalizar el estado de selección de mi subclase UICollectionViewCell?
volver al fragmento del viajero destiny 2 (4)
Tengo una subclase UICollectionViewCell personalizada que sobrescribe initWithFrame:
y layoutSubviews
para configurar sus vistas. Sin embargo, ahora estoy tratando de hacer dos cosas con las que estoy teniendo problemas.
1) Estoy intentando personalizar el estado de UICollectionViewCell
al seleccionarlo. Por ejemplo, quiero cambiar una de las imágenes en un UIImageView
en el UICollectionViewCell
.
2) Quiero animar (light bounce) el UIImage
en el UICollectionViewCell
.
¿Alguien puede señalarme en la dirección correcta?
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
MyCollectionViewCell *cell = (MyCollectionViewCell *)[collectionView cellForItemAtIndexPath:indexPath];
[cell setSelected:YES];
}
Agregue un método público performSelectionAnimations
a la definición de MyCollectionViewCell
que cambia el UIImageView
deseado y realiza la animación deseada. Luego collectionView:didSelectItemAtIndexPath:
desde collectionView:didSelectItemAtIndexPath:
Así que en MyCollectionViewCell.m:
- (void)performSelectionAnimations {
// Swap the UIImageView
...
// Light bounce animation
...
}
Y en tu UICollectionViewController
:
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
MyCollectionViewCell *cell = (MyCollectionViewCell *)[collectionView cellForItemAtIndexPath:indexPath];
[cell performSelectionAnimations];
}
Note que he sacado la llamada a [cell setSelected:YES]
, ya que eso ya debe ser atendido por UICollectionView. De la documentación:
La forma preferida de seleccionar la celda y resaltarla es usar los métodos de selección del objeto de vista de colección.
En su subclase UICollectionViewCell
personalizada, puede implementar didSet
en la propiedad 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
}
}
}
En su subclase UICollectionViewCell personalizada, podría anular el setSelected:
así:
- (void)setSelected:(BOOL)selected {
[super setSelected:selected];
if (selected) {
[self animateSelection];
} else {
[self animateDeselection];
}
}
Descubrí que al tocar repetidamente este método se invoca en una celda, incluso si ya está seleccionado, por lo que quizás desee verificar que realmente está cambiando de estado antes de disparar animaciones no deseadas.
Si desea mostrar la animación en la selección, el siguiente método podría serle útil:
- (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]];
}
];
}