Me gustaría empezar alguna animación en un UICollectionViewCell cuando el usuario pulsa en una celda. Mi idea era seleccionar la celda correspondiente en didSelectItemAtIndexPath y activar una animación. Sin embargo, esto no funciona:

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
//animate the cell user tapped on
ProductCollectionViewCell* cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"ProductReuseID" forIndexPath:indexPath];

[UIView animateWithDuration:5.0
                      delay:0
                    options:(UIViewAnimationOptionAllowUserInteraction)
                 animations:^{
                     NSLog(@"animation start");
                     [cell.layer setBackgroundColor:[UIColor colorWithRed: 180.0/255.0 green: 238.0/255.0 blue:180.0/255.0 alpha: 1.0].CGColor];
                 }
                 completion:^(BOOL finished){
                     NSLog(@"animation end");
                     [cell.layer setBackgroundColor:[UIColor whiteColor].CGColor];
                 }
 ];
}

Realidad, la animación se inicia y termina en el mismo tiempo (aunque animateWithDuration se establece en 5). Siguiente intento fue para saltar la animación y simplemente poner por ejemplo un diferente estilo de borde:

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
//animate the cell user tapped on
ProductCollectionViewCell* cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"ProductReuseID" forIndexPath:indexPath];

[cell.layer setBorderWidth:5.0f];
}

Sin embargo, esto no cambia nada (probablemente porque tengo que volver a dibujar la celda manualmente?).

¿Tiene usted alguna idea de cómo animar una UICollectionViewCell cuando el usuario tocó?

Saludos
Cristiano

OriginalEl autor itsame69 | 2012-10-31

2 Comentarios

  1. 30

    Parece que no son la obtención de la Celda equivocada. El envío de la dequeueReusableCellWithReuseIdentifier:forIndexPath: mensaje no no obtener la celda en uso en la vista en la indexPath en el segundo parámetro, pero dequeues un usado con anterioridad, pero reutilizables de la célula; si no reutilizables de la célula está disponible, se crea uno nuevo. Ver Referencia 1 a continuación.

    Reemplazando:

    ProductCollectionViewCell* cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"ProductReuseID" forIndexPath:indexPath];
    

    Con:

    ProductCollectionViewCell* cell = [collectionView cellForItemAtIndexPath:indexPath];
    

    En el código anterior, debe darle la celda adecuado para trabajar con.

    Aquí está su puño ejemplo, reescrito.

    - (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath(NSIndexPath *)indexPath
    {
        //animate the cell user tapped on
        UICollectionViewCell  *cell = [collectionView cellForItemAtIndexPath:indexPath];    
        [UIView animateWithDuration:5.0
                delay:0
                options:(UIViewAnimationOptionAllowUserInteraction)
                    animations:^{
                        NSLog(@"animation start");
                        [cell setBackgroundColor:[UIColor colorWithRed: 180.0/255.0 green: 238.0/255.0 blue:180.0/255.0 alpha: 1.0]];
                    }
                    completion:^(BOOL finished){
                        NSLog(@"animation end");
                        [cell setBackgroundColor:[UIColor whiteColor]];
                    }
        ];
    }
    

    Referencias:

    Muchas gracias! Que resuelto el problema…
    OMG, gracias por esto.

    OriginalEl autor Kevin Viggers

  2. 2

    Usted puede personalizar la animación, mientras que seleccione y toque la UICollectionViewCell con la animación personalizada duración siguiendo el código. Así, Usted no necesita cambiar el color de fondo de la misma.

    Con las siguientes opciones – UIViewAnimationOption

    • UIViewAnimationOptionCurveEaseIn
    • UIViewAnimationOptionCurveEaseOut
    • UIViewAnimationOptionAllowUserInteraction

      UICollectionViewDelegate – didSelectItemAtIndexPath método

      UICollectionViewCell *uviCollectionCell =  [collectionView cellForItemAtIndexPath:indexPath];
      
      [UIView animateWithDuration:0.4 delay:0 options:(UIViewAnimationOptionCurveEaseIn) animations:^{
              NSLog(@"animation start");
              CALayer *layer = uviCollectionCell.layer;
              CATransform3D rotationAndPerspectiveTransform = CATransform3DIdentity;
              rotationAndPerspectiveTransform = CATransform3DRotate(rotationAndPerspectiveTransform, 15.0f * M_PI /180.0f, 1.0f, 0.0f, 0.0f);
              layer.transform = rotationAndPerspectiveTransform;
      } completion:^(BOOL finished) {
              [UIView animateWithDuration:0.3 delay:0 options:(UIViewAnimationOptionCurveEaseOut) animations:^{
                  NSLog(@"animation end");
                  CALayer *layer = uviCollectionCell.layer;
                  CATransform3D rotationAndPerspectiveTransform = CATransform3DIdentity;
                  rotationAndPerspectiveTransform.m24 = 0;
                  rotationAndPerspectiveTransform =CATransform3DRotate(rotationAndPerspectiveTransform, 0.0f * M_PI /180.0f, 1.0f, 0.0f, 0.0f);
                  layer.transform = rotationAndPerspectiveTransform;
              } completion:nil];
          }
      ];
      

    OriginalEl autor Vignesh Kumar

Dejar respuesta

Please enter your comment!
Please enter your name here