Etiqueta multilínea en UIStackView


Cuando se coloca la etiqueta multilínea (con el salto de línea establecido en Ajuste de línea) en una vista de pila, la etiqueta pierde inmediatamente el salto de línea y muestra el texto de la etiqueta en una línea.

¿Por qué sucede esto y cómo se conserva una etiqueta multilínea dentro de una vista de pila?

Author: Boon, 2015-12-21

13 answers

  1. Embed the UILabel inside a UIView (Editor -> Embed In -> View)
  2. Use restricciones para ajustar UILabel a UIView (por ejemplo, restricciones de espacio final, espacio superior y espacio inicial a superview)

El UIStackView estirará el UIView para que encaje correctamente, y el UIView limitará el UILabel a múltiples líneas.

 118
Author: Andy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-25 22:48:34
  • Primero establezca el número de líneas de la etiqueta en 0
  • La vista de pila todavía no crecerá a multiLine a menos que le dé un ancho fijo. Cuando fijamos su ancho entonces se rompe a multilínea cuando se alcanza ese ancho como se muestra:

grabación de pantalla

Si no damos un ancho fijo a la vista de pila, entonces las cosas se vuelven ambiguas. ¿Cuánto tiempo crecerá la vista de pila con la etiqueta (si el valor de la etiqueta es dinámico)?

Espero que esto pueda solucionar su problema.

 39
Author: Irfan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-21 21:08:56

Para una vista de pila horizontal que tiene un UILabel como una de sus vistas, en Interface Builder primero establezca label.numberOfLines = 0. Esto debería permitir que la etiqueta tenga más de 1 línea. Esto inicialmente no funcionó para mí cuando la vista de pila tenía label.alignment = .fill. Para que funcione simplemente establezca label.alignment = .center. La etiqueta ahora puede expandirse a varias líneas dentro de UIStackView.

La documentación de Apple dice

Para todas las alineaciones excepto la alineación de relleno, la vista de pila utiliza cada vistas dispuestas Propiedad intrinsicContentSize al calcular su tamaño perpendicular al eje de la pila

Note la palabraexcepto aquí. Cuando se usa .fill la horizontal UIStackView NO se redimensiona verticalmente usando los tamaños de subviews dispuestos.

 35
Author: pbm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-06 08:31:05

Simplemente establezca el número de líneas en 0 en el inspector de atributos para label. Funcionará para ti.

introduzca la descripción de la imagen aquí

 11
Author: technerd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-21 06:21:47

La siguiente es una implementación de Playground de etiqueta multilínea con un salto de línea dentro de un UIStackView. No requiere incrustar el UILabel dentro de nada y ha sido probado con Xcode 9.2 y Swift 4. Espero que sea útil.

import UIKit
import PlaygroundSupport

let containerView = UIView()
containerView.frame = CGRect.init(x: 0, y: 0, width: 400, height: 500)
containerView.backgroundColor = UIColor.white

var label = UILabel.init()
label.textColor = .black
label.numberOfLines = 0
label.translatesAutoresizingMaskIntoConstraints = false
label.text = "This is an example of sample text that goes on for a long time. This is an example of sample text that goes on for a long time."

let stackView = UIStackView.init(arrangedSubviews: [label])
stackView.translatesAutoresizingMaskIntoConstraints = false
stackView.axis = .vertical
stackView.distribution = .fill
stackView.alignment = .fill
containerView.addSubview(stackView)
stackView.centerXAnchor.constraint(equalTo: containerView.centerXAnchor).isActive = true
stackView.centerYAnchor.constraint(equalTo: containerView.centerYAnchor).isActive = true
stackView.widthAnchor.constraint(equalTo: containerView.widthAnchor).isActive = true
stackView.heightAnchor.constraint(equalTo: containerView.heightAnchor).isActive = true

PlaygroundPage.current.liveView = containerView
 2
Author: JaredH,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-21 21:04:35

Añadir UIStackView propiedades,

stackView.alignment = .fill
stackView.distribution = .fillProportionally
stackView.spacing = 8.0
stackView.axis = .horizontal

En lugar de agregar etiqueta dentro de UIView que no es necesario.Si está utilizando inside UITableViewCell por favor, recargue los datos en rotación.

 1
Author: Sagar Daundkar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-18 08:02:13

Establecer preferredMaxLayoutWidth en la etiqueta UILabel funcionó para mí

self.myLabel.preferredMaxLayoutWidth = self.bounds.size.width;
 1
Author: Pablo Martinez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-08 08:32:07

IOS 9 +

Llama a [textLabel sizeToFit] después de configurar el texto de la etiqueta UILabel.

SizeToFit reorganizará la etiqueta multilínea usando preferredMaxWidth. La etiqueta redimensionará el StackView, que redimensionará la celda. No se requieren restricciones adicionales además de anclar la vista de pila a la vista de contenido.

 1
Author: aumansoftware,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-21 21:07:40

El truco de magia para mí era establecer un widthAnchor al UIStackView.

Configurar leadingAnchor y trailingAnchor no funcionará, pero configurar centerXAnchor y widthAnchor hizo que la etiqueta UILabel se mostrara correctamente.

 1
Author: Skoua,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-26 17:34:44

En mi caso, seguí las sugerencias anteriores, pero mi texto todavía estaba siendo truncado a una sola línea, aunque solo en horizontal. Resulta que encontré un carácter invisible \0 null en el texto de la etiqueta que fue el culpable. Debe haber sido introducido junto al símbolo em dash que había insertado. Para ver si esto también sucede en su caso, use el depurador de vista para seleccionar su etiqueta e inspeccionar su texto.

 0
Author: Joey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-13 06:23:47

El diseño del sistema debe averiguar el origen, el ancho y el alto para dibujarlo subviews, en este caso, todas sus subviews tienen la misma prioridad, ese punto crea conflictos, el sistema de diseño no conoce las dependencias entre las vistas, cuál dibuja primero, segundo y así sucesivamente

La compresión Set stack subviews resolverá el problema con varias líneas, dependiendo de que su vista de pila sea horizontal o vertical y de cuál desea que se convierta en varias líneas. stackOtherSubviews .setContentCompressionResistancePriority(.defaultHight, for: .horizontal) lblTitle.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)

 0
Author: Trung Phan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-27 09:55:46

Xcode 9.2:

Simplemente establezca el número de líneas en 0. Storyboard se verá raro después de configurar esto. No te preocupes ejecuta el proyecto. Mientras se ejecuta todo se redimensionará de acuerdo con la configuración de su guion gráfico. Creo que es una especie de error en storyboard. introduzca la descripción de la imagen aquí

Consejos : Establezca "número de trazador de líneas a 0" en el último. resetearlo cuando desee editar alguna otra vista y establecer en 0 después de la edición.

introduzca la descripción de la imagen aquí

 0
Author: Surendra Kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-07 06:04:46

Lo que funcionó para mí!

Stackview: alineación: relleno, distribución: relleno, restricción anchura proporcional a superview ex. 0.8,

Etiqueta: centro , y líneas = 0

 0
Author: Michał Ziobro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-10-02 09:42:49