2010-07-21 20 views
9

Al aumentar la altura de la etiqueta, todo está bien y sin problemas. Al disminuir, la etiqueta cambia instantáneamente el tamaño y luego lo reposiciona con animación.Animación del tamaño de UILabel disminución

@interface 
@property (nonatomic, retain) IBOutlet UILabel *explanationLabel; 

@implementation 
CGRect frmExpl = explanationLabel.frame; 
[UIView beginAnimations:nil context:NULL]; 
[UIView setAnimationDuration:0.75]; 

frmExpl.size.height -= height; 
explanationLabel.frame = frmExpl; 

[UIView commitAnimations]; 

He intentado reemplazar UILabel con UIView y, por supuesto, no hay ningún problema con UIView.

¿Hay alguna manera especial de animar la disminución del tamaño UILabel?

Aquí hay un proyecto mínimo que demuestra el problema descrito. Download

+0

¿De dónde sacas frmExpl? – deanWombourne

+0

Desde el marco de la etiqueta, que está diseñado en archivo de punta. Actualizado. – Pablo

+0

http://stackoverflow.com/questions/17360402/why-are-animations-on-bounds-of-an-uilabel-only-working-when- engraving-the-size –

Respuesta

2

Creo que lo que quiere cambiar son los límites, en lugar del marco. De los documentos:

"El rectángulo de límites determina el origen y la escala en el sistema de coordenadas de la vista dentro de su rectángulo y se mide en puntos. Establecer esta propiedad cambia el valor de la propiedad de marco en consecuencia". - Clase UIView; propiedad bounds

Pruebe algo como:

- (void)animate:(id)sender 
{ 
    ... 
    CGRect newBounds = testLabel.bounds; 
    newBounds.size.height += 50; 
    testLabel.bounds = newBounds; 
    ... 
} 
+0

El aumento de los límites cambia el marco, pero el marco permanece igual en la pantalla. La disminución de los límites funciona. Pero esta no es la solución, ya que necesito tanto aumentar como disminuir. Sospecho que esto es un error en el marco. – Pablo

+1

Es cierto que probablemente sea un error. ¿Podría cambiar su jerarquía de vistas para tener una UIView con el fondo azul y luego una UILabel de tamaño fijo que simplemente tiene sus puntales y resortes configurados para flotar en el medio de la UIView. Dado que UIView se anima correctamente, podría ser una solución. –

14

La cuestión es que el UILabel vuelve a dibujarse automáticamente tan pronto como sus cambios de tamaño. (No puede volver a dibujar cada cuadro de la animación porque la representación del texto ocurre en la CPU, no en la GPU donde se ejecutan las animaciones UIView). Puede evitar que se vuelva a dibujar cambiando la propiedad ContentMode de la etiqueta a, por ejemplo, UIViewContentModeCenter.

+0

¿Han cambiado las cosas? Después de haber probado esto parece que no funciona .. –

+0

Muchas gracias, funcionó para mí –

+0

perdido 2 días para descubrir esta configuración, ¡gracias! – dreampowder

2

Utilice CGAffineTransform para hacerlo.

[UIView animateWithDuration:1.0 animations:^{ 
    // Scale down 50% 
    label.transform = CGAffineTransformScale(label.transform, 0.5, 0.5); 
} completion:^(BOOL finished) { 
    [UIView animateWithDuration:1.0 animations:^{ 
     // Scale up 50% 
     label.transform = CGAffineTransformScale(label.transform, 2, 2); 
    }]; 
}]; 
+0

Me funcionó, pero afectó otras animaciones como Fading in y Fading in the UIView. ¿Puedes decirme cómo resolver este problema y por qué estas animaciones están en conflicto? He votado tu respuesta. – Developer

+2

usando transformaciones afines en UILAbles tiene algunos efectos secundarios desagradables, como la distorsión del texto en la etiqueta. no es una solución útil. – katzenhut

Cuestiones relacionadas