Pregunta

Tengo un UILabel que muestra la fecha actual para la visión actual de mi punto de vista de desplazamiento. Cuando me desplazo este punto de vista a la izquierda (a las páginas de la izquierda), me gustaría que esta etiqueta para cambiar al día anterior, con un efecto de cruce entre las 2 fechas.

tomo como referencia el efecto de atenuación del trampolín cuando se desplaza a la página de Spotlight. Creo que esto es similar pero no tengo ni idea de cómo ponerlo en práctica!

¿Dónde pongo el código, qué tengo que usar 2 UILabel diferente o tal vez CoreAnimation? ¿Cuándo puedo cambiar la fecha?

Gracias de antemano!

¿Fue útil?

Solución

  1. En el método delegado scrollViewDidScroll:, comprobar si contentOffset de la vista de desplazamiento indica que el usuario ha desplazado a otra página.
  2. Si es así, cambie el texto de la etiqueta para la nueva fecha. No se animará aún, pero hacer esto antes de intentar la animación.
  3. Para la animación, añadir un CATransition a la capa de la etiqueta y configurarlo a su gusto:

    // Create a transition animation and add it to the label's layer:
    CATransition *transition = [CATransition animation];
    transition.type = kCATransitionFade;
    transition.duration = 0.25;
    [self.dateLabel.layer addAnimation:transition forKey:@"textTransition"];
    // Change the label's text as before:
    self.dateLabel.text = newDateString;
    

Este efecto es un poco diferente de la decoloración de los iconos del Springboard (ya que aquellos se desvanecen continuamente a medida que se desplaza más hacia la página de Spotlight) pero creo que mi enfoque es más apropiado para su aplicación. Para emular el efecto trampolín, se debe utilizar de hecho dos etiquetas separadas (con el mismo marco) y cambiar sus valores de opacidad como cambios contentOffset de la vista de desplazamiento.

Otros consejos

Uso de Core Animation con dos etiquetas funcionaría bien. Cambiar la propiedad de un resultado capa Core Animation en una transición sin problemas de forma predeterminada, por lo que puede utilizar para su ventaja. Por ejemplo:

- (void)crossfadeDateLabels
{
    date1Label.layer.opacity = 0.0f;
    date2Label.layer.opacity = 1.0f;
}

O puede utilizar el modelo de animación explícita si desea tener más control:

- (void)crossfadeDateLabels
{
    CABasicAnimation *date1Anim = [CABasicAnimation animationWithKeyPath:@"opacity"];
    date1Anim.duration = 1.0f;
    date1Anim.fromValue = [NSNumber numberWithFloat:1.0f];
    date1Anim.toValue = [NSNumber numberWithFloat:0.0f]

    // Do something similar for date2Anim...

    [date1Label.layer addAnimation:date1Anim forKey:nil];
    [date2Label.layer addAnimation:date2Anim forkey:nil];
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top