2011-06-14 13 views
6

Intento animar una UIlabel para que primero crezca y luego retroceda a su marco original. Ampliación del trabajo como se esperaba, pero sin disminuir. Cuando encojo la etiqueta con el código siguiente, el tamaño se ajusta primero antes de que se cambie el origen. Esto causa una animación de dos pasos que no es uniforme.Animate UILabel no es liso

Aquí está mi código:

CGRect rect = label.frame; 
[UIView animateWithDuration:.2 
         delay: 0.1 
        options: UIViewAnimationOptionBeginFromCurrentState 
       animations:^{ 
        label.frame = CGRectMake(rect.origin.x + 4, 
                     rect.origin.y + 4, 
                     rect.size.width-8, 
                     rect.size.height-8); 
       } 
       completion:^(BOOL finished){ 
       }]; 
+0

usted no está haciendo una transición. ¿Por qué estás usando 'UIViewAnimationOptionTransitionNone'? –

+0

No se olvide de dar la recompensa :) – jmosesman

Respuesta

2

Usted podría intentar aplicar una transformación para la etiqueta dentro de su bloque de animación en lugar de ajustar el rect. Algo así como las siguientes líneas para el cultivo/encogimiento animaciones:

label.transform = CGAffineTransformMakeScale(1.5, 1.5); //grow 
label.transform = CGAffineTransformMakeScale(1, 1);  //shrink 
2

favor puesta a punto esta solución, supongo que es lo que busca. Lo probé para que funcione, pero por favor intente y avíseme si lo está buscando o no.

-(IBAction)growanimate:(id)sender 
{ 
    [UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationDuration:1]; 
    [UIView setAnimationCurve:UIViewAnimationCurveLinear]; 
    [UIView setAnimationDelegate:self]; 
    [UIView setAnimationDidStopSelector:@selector(shrinkanimate)]; 
    label.transform = CGAffineTransformMakeScale(2.0f, 2.0f); //This will double label from current size. 
    [UIView commitAnimations]; 
} 

-(void)shrinkanimate 
{ 
    [UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationDuration:1]; 
    [UIView setAnimationCurve:UIViewAnimationCurveLinear]; 
    label.transform = CGAffineTransformMakeScale(1.0f, 1.0f); //This will get it back to original size. 
    [UIView commitAnimations]; 
} 
+0

thx ... para la versión más detallada, pero obtuvo la respuesta antes – prostock

1

Supongo que el problema se debe a que el cambio de tamaño del fotograma dispara las notificaciones de cambio de tamaño. Puede haber más interrupciones al contraerse porque se revelan nuevas áreas de la supervista.

El método de transformación es mucho mejor, en este caso.

También supongo que con el método de transformación, las rutas y el diseño de los glifos (saltos de línea, etc.) no se vuelven a calcular y las CGPath en caché simplemente se transforman en el tiempo de renderizado.


Sobre el problema de centrado, no veo ningún problema.

Me gustaría agregar, que si planea hacer un uso extensivo de este efecto, puede crear una clase estática para este efecto, o que contenga varias animaciones preestablecidas, con transformadas almacenadas estáticamente en su interior.

Luego realiza llamadas como [MyPopEffect popView: mylabel];

Evita la creación y liberación de transformaciones, y permite el uso instantáneo de cualquier vista, o en otros proyectos.

De todos modos, aquí está el código de animación ... Saludos

[

UIView animateWithDuration:0.5f delay: 0.0f 
    options:UIViewAnimationOptionCurveEaseOut+UIViewAnimationOptionBeginFromCurrentState 
     animations:^{ 
      label.transform=CGAffineTransformMakeScale(2.0f,2.0f); 
     } 
    completion:^(BOOL finished){ 
      [UIView animateWithDuration:0.5f delay: 0.0f 
      options:UIViewAnimationOptionCurveEaseIn+UIViewAnimationOptionBeginFromCurrentState 
      animations:^{ 
       label.transform=CGAffineTransformMakeScale(1.0f,1.0f); 
      } 
      completion:^(BOOL finished){}]; 
    }]; 

]