¿Por qué las animaciones en los límites de un UILabel solo funcionan al boost el tamaño?

Noté que cuando cambio los límites de una UILabel en un bloque de animation, solo funciona si aumento el tamaño, cuando disminuyo el tamaño, la UILabel solo cambia su tamaño pero no se anima. Reemplazar el UILabel con una UIView normal funciona como está previsto.

Nota: Cambiar la propiedad contentMode de UILabel a UIViewContentModeScaleToFill corrige este problema, pero todavía no entiendo por qué funciona al boost el tamaño sin cambiar la propiedad contentMode.

#import "FooView.h" @interface FooView () @property (strong, nonatomic) UILabel *label; @property (assign, nonatomic) BOOL resized; @end @implementation FooView - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { self.backgroundColor = [UIColor lightGrayColor]; self.label = [[UILabel alloc] initWithFrame:(CGRect){0, 0, frame.size}]; self.label.backgroundColor = [UIColor greenColor]; [self addSubview:self.label]; _resized = false; UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(changeSize)]; tapRecognizer.numberOfTapsRequinetworking = 1; [self addGestureRecognizer:tapRecognizer]; } return self; } - (void)changeSize { [UIView animateWithDuration:0.8 delay:0.0 options:UIViewAnimationOptionCurveEaseIn animations:^{ CGRect bounds = self.label.bounds; if (self.resized) { bounds.size.height *= 2; bounds.size.width *= 2; } else { bounds.size.width /= 2; bounds.size.height /= 2; } self.label.bounds = bounds; } completion:^(BOOL finished) { self.resized = !self.resized; }]; } @end 

Es porque UILabel establece el contentsGravity su capa de UILabel en el text de dirección que se está procesando, lo que ocurre de forma pnetworkingeterminada en UIViewContentModeLeft (o @"left" ). Por lo tanto, cuando se le dice a la capa que se anima, primero echa un vistazo a su contenido de gravedad y basa las animaciones subsiguientes en eso. Debido a que ve @"left" donde debería haber @"resize" , supone que la animation de escala debe comenzar desde la izquierda, pero también debe respetar las restricciones que le ha dado (los cambios de límites), por lo que su label parece saltar a su tamaño final y luego se asienta donde debería en el centro de la pantalla.

Si desea dejar contentMode solo, utilice CATransform3D y escala la capa de la label de esa manera en lugar de un cambio de límites.