iOS: UILabel multilínea en layout automático

Tengo problemas para tratar de lograr un comportamiento de layout muy básico con Auto Layout. Mi controller de vista se ve así en IB:

introduzca la descripción de la imagen aquí

La label superior es la label del título, no sé cuántas líneas será. Necesito la label del título para mostrar todas las líneas de text. También necesito las otras dos tags y la pequeña image que se colocará debajo del título, por muy alto que parezca. He establecido restricciones de espacio vertical entre las tags y la image pequeña, así como una restricción de espacio superior entre la label del título y su supervisión y una restricción de espacio inferior entre la image pequeña y su supervisión. La UIView blanca no tiene restricciones de altura, por lo que debería estirarse verticalmente para contener sus subvistas. He establecido el número de líneas para la label del título en 0.

¿Cómo puedo hacer que la label del título cambie de tamaño para ajustarse al número de líneas requerido por la cadena? Entiendo que no puedo usar los methods setFrame porque estoy usando el layout automático. Y tengo que usar Auto Layout porque necesito que esas otras vistas se mantengan debajo de la label del título (de ahí las restricciones).

¿Cómo puedo hacer que esto suceda?

Use -setPrefernetworkingMaxLayoutWidth en la UILabel y la UILabel automática debe manejar el rest.

 [label setPrefernetworkingMaxLayoutWidth:200.0]; 

Consulte la documentation de UILabel .

ACTUALIZAR:

Solo es necesario establecer la restricción de altura en el guión gráfico a mayor o igual que ", sin necesidad de establecerPrefernetworkingMaxLayoutWidth.

Expande tu label establece el número de líneas en 0 y también más importante para la altura del set de layout automático a> = x. El layout automático hará el rest. También puede contener sus otros elementos basados ​​en el elemento anterior para ubicarlo correctamente.

diseño automático

Fuente: http://www.objc.io/issue-3/advanced-auto-layout-toolbox.html

Tamaño del contenido intrínseco del text multilínea

El tamaño de contenido intrínseco de UILabel y NSTextField es ambiguo para el text de varias líneas. La altura del text depende del ancho de las líneas, que aún no se ha determinado al resolver las restricciones. Para resolver este problema, ambas classs tienen una nueva propiedad llamada prefernetworkingMaxLayoutWidth, que especifica el ancho de línea máximo para calcular el tamaño de contenido intrínseco.

Dado que generalmente no conocemos este valor por adelantado, necesitamos tomar un enfoque de dos pasos para corregir esto. Primero dejamos que el layout automático haga su trabajo, y luego usamos el marco resultante en el pase de layout para actualizar nuevamente el ancho máximo y el layout de disparo preferidos.

 - (void)layoutSubviews { [super layoutSubviews]; myLabel.prefernetworkingMaxLayoutWidth = myLabel.frame.size.width; [super layoutSubviews]; } 

La primera llamada a [super layoutSubviews] es necesaria para que la label obtenga su marco establecido, mientras que la segunda llamada es necesaria para actualizar el layout después del cambio. Si omitimos la segunda llamada, obtendremos un error NSInternalInconsistencyException, porque hemos realizado cambios en el pase de layout que requieren actualizar las restricciones, pero no activamos el layout nuevamente.

También podemos hacer esto en una subclass de label en sí:

 @implementation MyLabel - (void)layoutSubviews { self.prefernetworkingMaxLayoutWidth = self.frame.size.width; [super layoutSubviews]; } @end 

En este caso, no es necesario llamar a [super layoutSubviews] primero, porque cuando se invoca layoutSubviews, ya tenemos un marco en la label.

Para realizar este ajuste desde el nivel del controller de vista, conectamos a viewDidLayoutSubviews. En este punto, los frameworks del primer pase de layout automático ya están configurados y podemos usarlos para establecer el ancho máximo preferido.

 - (void)viewDidLayoutSubviews { [super viewDidLayoutSubviews]; myLabel.prefernetworkingMaxLayoutWidth = myLabel.frame.size.width; [self.view layoutIfNeeded]; } 

Por último, asegúrese de que no tenga una restricción de altura explícita en la label que tenga una prioridad más alta que la prioridad de resistencia de compression de contenido de la label. De lo contrario, superará la altura calculada del contenido. Asegúrese de verificar todas las restricciones que pueden afectar la altura de la label.

Estaba luchando con este escenario exacto, pero con bastantes más vistas que necesitaban cambiar el tamaño y moverse hacia abajo según fuera necesario. Me estaba volviendo loco, pero finalmente lo descubrí.

Aquí está la key: a Interface Builder le gusta lanzar restricciones adicionales a medida que agrega y mueve vistas, y es posible que no se dé count. En mi caso, tenía una vista a mitad de path que tenía una restricción adicional que especificaba el tamaño entre él y su supervisor, básicamente fijándolo a ese punto. Eso significaba que nada por encima de él podría cambiar de tamaño más grande porque iría en contra de esa restricción.

Una manera fácil de saber si este es el caso es intentar cambiar el tamaño de la label manualmente. ¿El IB te deja crecer? Si lo hace, ¿las tags de abajo se mueven como esperas? Asegúrate de haber verificado estos dos antes de cambiar el tamaño para ver cómo tus restricciones moverán tus puntos de vista:

Menú IB

Si la vista está atascada, siga las vistas que están debajo y asegúrese de que una de ellas no tenga un espacio superior para la restricción de supervisión. Luego, asegúrese de que la opción de número de líneas para la label se establece en 0 y debe ocuparse del rest.

Me parece que necesita lo siguiente:

  • Una restricción superior
  • Una restricción principal (por ejemplo, el lado izquierdo)
  • Una restricción final (por ejemplo, el lado derecho)
  • Establezca prioridad de aarm de contenido, horizontal a bajo, para que llene el espacio dado si el text es corto.
  • Configure la resistencia de compression de contenido, horizontal a baja, por lo que se ajustará en lugar de tratar de ampliarse.
  • Establezca el número de líneas en 0.
  • Establezca el modo de salto de línea en el ajuste de palabra.

Ninguna de las diferentes soluciones encontradas en los muchos temas sobre el tema funcionó a la perfección para mi caso (x tags multilíneas dinámicas en celdas dinámicas de vista de tabla).

Encontré una forma de hacerlo:

Después de establecer las restricciones en su label y establecer su propiedad multilínea en 0, realice una subclass de UILabel; Llamé a la mía AutoLayoutLabel:

 @implementation AutoLayoutLabel - (void)layoutSubviews{ [self setNeedsUpdateConstraints]; [super layoutSubviews]; self.prefernetworkingMaxLayoutWidth = CGRectGetWidth(self.bounds); } @end 

Tengo una UITableViewCell que tiene una label de ajuste de text. Trabajé el ajuste de text de la siguiente manera.

1) Establezca las restricciones de UILabel de la siguiente manera.

introduzca la descripción de la imagen aquí

2) Establecer no. de líneas a 0.

3) Se agregó la restricción de altura UILabel a UITableViewCell.

 @IBOutlet weak var priorityLabelWidth: NSLayoutConstraint! 

4) En UITableViewCell:

 priorityLabel.sizeToFit() priorityLabelWidth.constant = priorityLabel.intrinsicContentSize().width+5 

Una forma de hacer esto … A medida que aumenta la longitud del text intente cambiar (disminuir) el tamaño de letra del text de la label usando

 Label.adjustsFontSizeToFitWidth = YES;