Fuente: http://www.objc.io/issue-3/advanced-auto-layout-toolbox.html
Tamaño del contenido intrínseco del texto de varias líneas
El tamaño del contenido intrínseco de UILabel y NSTextField es ambiguo para texto de varias líneas. La altura del texto depende del ancho de las líneas, que aún no se ha determinado al resolver las restricciones. Para resolver este problema, ambas clases tienen una nueva propiedad llamada preferredMaxLayoutWidth, que especifica el ancho de línea máximo para calcular el tamaño del contenido intrínseco.
Como generalmente no conocemos este valor de antemano, debemos adoptar un enfoque de dos pasos para hacerlo bien. Primero dejamos que el diseño automático haga su trabajo, y luego usamos el marco resultante en el pase de diseño para actualizar el ancho máximo preferido y activar el diseño nuevamente.
- (void)layoutSubviews
{
[super layoutSubviews];
myLabel.preferredMaxLayoutWidth = myLabel.frame.size.width;
[super layoutSubviews];
}
La primera llamada a [super layoutSubviews] es necesaria para que la etiqueta obtenga su conjunto de marcos, mientras que la segunda llamada es necesaria para actualizar el diseño después del cambio. Si omitimos la segunda llamada, obtenemos un error NSInternalInconsistencyException, porque hemos realizado cambios en el pase de diseño que requieren actualizar las restricciones, pero no activamos el diseño nuevamente.
También podemos hacer esto en una subclase de etiqueta:
@implementation MyLabel
- (void)layoutSubviews
{
self.preferredMaxLayoutWidth = self.frame.size.width;
[super layoutSubviews];
}
@end
En este caso, no necesitamos llamar a [super layoutSubviews] primero, porque cuando se llama a layoutSubviews, ya tenemos un marco en la etiqueta.
Para realizar este ajuste desde el nivel del controlador de vista, conectamos a viewDidLayoutSubviews. En este punto, los fotogramas de la primera pasada de diseño automático ya están configurados y podemos usarlos para establecer el ancho máximo preferido.
- (void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];
myLabel.preferredMaxLayoutWidth = myLabel.frame.size.width;
[self.view layoutIfNeeded];
}
Por último, asegúrese de no tener una restricción de altura explícita en la etiqueta que tenga una prioridad más alta que la prioridad de resistencia de compresión de contenido de la etiqueta. De lo contrario, prevalecerá sobre la altura calculada del contenido. Asegúrese de verificar todas las restricciones que pueden afectar la altura de la etiqueta.