La restricción animada Autolayout no anima las subvenciones.

Tengo una UIView que tiene una UILabel como subvista en ella.

Ahora cambio el ancho de UIView con una animation (cambiando la propiedad constante de restricción) y llamo layoutIfNeeded en UIView animate …)

La vista cambia de tamaño normal, pero la UILabel (subview) cambia el tamaño de fuente al tamaño 'end' pero no se animó correctamente como la uiview.

De acuerdo con la session WWDC 2012, las subvenciones deberían animarse si solo se modifica la constante de la supervisión.

El UILabel tiene una escala de fuente mínima de 0,1 que es menor que la fuente tiene que cambiar el tamaño.

Estaba luchando animando un UILabel tamaño de UILabel cambiando su restricción de width . La label tenía adjustsFontSizeToFitWidth y minimumScaleFactor .

Lo arreglé estableciendo el contentMode las tags ' UIViewContentModeScaleAspectFit ' en UIViewContentModeScaleAspectFit . De forma pnetworkingeterminada, para las tags es UIViewContentModeLeft .

No creo que puedas animar el tamaño del text de esa manera. La única forma en que puedo pensar para hacer esto es crear una vista de instantánea de la label, agregar esa vista sobre la label, hacer la animation y luego eliminar la vista de instantánea. Este código mueve el text más pequeño hacia abajo un poco, pero se ve bastante bien, con solo un movimiento muy pequeño al mostrar la label y eliminar la vista de la image. La pequeña vista que contiene la label tenía un tamaño de 185×36, y la label tenía restricciones de 20 a cada lado de smallView y 8 a la parte superior y 7 a la parte inferior. Agrego esas mismas restricciones en el código a la vista de la image.

 @interface ViewController () @property (weak, nonatomic) IBOutlet NSLayoutConstraint *widthCon; // width constraint on smallView @property (weak,nonatomic) IBOutlet UIView *smallView; // view that the label is embedded in @property (weak,nonatomic) IBOutlet UILabel *label; @end @implementation ViewController - (IBAction)shrinkView:(id)sender { UIView *snapshot = [self.label snapshotViewAfterScreenUpdates:YES]; [snapshot setTranslatesAutoresizingMaskIntoConstraints:NO]; [self.smallView addSubview:snapshot]; [self.smallView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|-20-[snapshot]-20-|" options:0 metrics:nil views:@{@"snapshot":snapshot}]]; NSLayoutConstraint *topCon = [NSLayoutConstraint constraintWithItem:snapshot attribute:NSLayoutAttributeTop relatedBy:0 toItem:self.smallView attribute:NSLayoutAttributeTop multiplier:1 constant:8]; NSLayoutConstraint *bottomCon = [NSLayoutConstraint constraintWithItem:self.smallView attribute:NSLayoutAttributeBottom relatedBy:0 toItem:snapshot attribute:NSLayoutAttributeBottom multiplier:1 constant:7]; [self.smallView addConstraints:@[topCon,bottomCon]]; [self.smallView layoutSubviews]; self.label.alpha = 0; self.widthCon.constant = 100; topCon.constant = 18; bottomCon.constant = 10; [UIView animateWithDuration:.5 animations:^{ [self.view layoutIfNeeded]; } completion:^(BOOL finished) { self.label.alpha = 1; [snapshot removeFromSuperview]; }]; } 

Después de Editar:

Hay una forma de animar la vista para que la label también se anime en lugar de ir inmediatamente a su tamaño final. Tienes que animar la restricción directamente con un timer (mira la explicación en unos 31 minutos en el video de WWDC 2012, "Mejores prácticas para dominar el layout automático"). Esto funciona para animar el tamaño de la label, pero el cambio de tamaño de la fuente es nervioso y no se ve tan bien. Si tiene una restricción de ancho para la vista en la que está la label (y la label tiene restricciones para ambos lados), puede hacer esto:

 -(IBAction)animateSizeChange:(id)sender { [NSTimer scheduledTimerWithTimeInterval:.001 target:self selector:@selector(doStuff:) userInfo:Nil repeats:YES]; } -(void)doStuff:(NSTimer *) aTimer { self.widthCon.constant -= .2; if (self.widthCon.constant <90) [aTimer invalidate]; }