Cuando se coloca la etiqueta multilínea (con el salto de línea establecido en Word Wrap) 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 la etiqueta multilínea dentro de una vista de pila?
Respuestas:
La respuesta correcta está aquí:
https://stackoverflow.com/a/43110590/566360
UILabel
interior de unUIView
(Editor -> Incrustar en -> Ver)UILabel
a laUIView
(por ejemplo, espacio final, espacio superior y espacio inicial para supervisar restricciones)Se
UIStackView
estiraráUIView
para que se ajuste correctamente yUIView
restringirá lasUILabel
líneas múltiples.fuente
UIView
travesuras necesarias.Para una vista de pila horizontal que tiene una
UILabel
de sus vistas, en Interface Builder se establece en primer lugarlabel.numberOfLines = 0
. Esto debería permitir que la etiqueta tenga más de 1 línea. Inicialmente, esto no funcionó para mí cuando la vista de la pila teníastackView.alignment = .fill
. Para que funcione, simplemente configúrelostackView.alignment = .center
. La etiqueta ahora puede expandirse a varias líneas dentro deUIStackView
.La documentación de Apple dice
Tenga en cuenta la palabra, excepto aquí. Cuando
.fill
se usa, la horizontalUIStackView
NO cambia de tamaño verticalmente usando los tamaños de subvistas organizados.fuente
.alignment
el UIStackView que debes configurar en cualquier cosa que.fill
no sea UILabel, lo cual es un poco confuso en el ejemplo dadolabel.alignment = .center
. Creo que esto debería serstackView.alignment = .center
multiLine
menos que le des un ancho fijo. Cuando arreglamos su ancho, se rompe a multilínea cuando se alcanza ese ancho como se muestra:Si no le damos un ancho fijo a la vista de la pila, 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 tu problema.
fuente
preferredMaxLayoutWidth
enviewDidLayoutSubviews
su etiqueta enUIViewController
o enlayoutSubviews
si subclaseUIView
.Establecer PreferredMaxLayoutWidth en UILabel funcionó para mí
fuente
.center
y realmente no necesitaba mi etiqueta dentro de UIView.Simplemente establezca el número de líneas en 0 en el inspector de atributos para la etiqueta. Funcionará para ti.
fuente
Después de probar todas las sugerencias anteriores, no encontré ningún cambio de propiedades para UIStackView. Solo cambio las propiedades de los UILabels de la siguiente manera (las etiquetas ya se han agregado a una vista de pila vertical):
Swift 4 ejemplo:
fuente
El truco de magia para mí fue establecer un
widthAnchor
aUIStackView
.Configuración
leadingAnchor
ytrailingAnchor
no funcionará, pero la configuracióncenterXAnchor
ewidthAnchor
hizo que UILabel se muestre correctamente.fuente
iOS 9+
Llame
[textLabel sizeToFit]
después de configurar el texto de UILabel.sizeToFit rediseñará la etiqueta multilínea con el ancho máximo preferido. La etiqueta cambiará el tamaño de stackView, que cambiará el tamaño de la celda. No se requieren restricciones adicionales además de fijar la vista de pila a la vista de contenido.
fuente
Aquí hay un ejemplo completo de una vertical
UIStackView
compuesta de líneasUILabel
múltiples con altura automática.Las etiquetas se ajustan según el ancho de la vista de pila y la altura de la vista de pila se basa en la altura de la etiqueta. (Con este enfoque no necesita incrustar las etiquetas en a
UIView
.) (Swift 5, iOS 12.2)Aquí hay una muestra
ViewController
que lo usa.fuente
Agregar
UIStackView
propiedades,En lugar de agregar una etiqueta dentro de la
UIView
cual no es necesario. Si está usando adentroUITableViewCell
, vuelva a cargar los datos en la rotación.fuente
La siguiente es una implementación de Playground de una etiqueta de varias líneas con un salto de línea dentro de a
UIStackView
. No requiere incrustarUILabel
nada en el interior y ha sido probado con Xcode 9.2 y Swift 4. Espero que sea útil.fuente
El diseño del sistema debe determinar el origen, el ancho y la altura para dibujar sus subvistas, en este caso todas sus subvistas tienen la misma prioridad, ese punto genera conflicto, el sistema de diseño no conoce las dependencias entre las vistas, cuál dibuja primero, segundo, etc.
Establecer compresión de subvistas de pila resolverá el problema con varias líneas, dependiendo de que su vista de pila sea horizontal o vertical y cuál desea que se convierta en varias líneas.
stackOtherSubviews .setContentCompressionResistancePriority(.defaultHight, for: .horizontal)
lblTitle.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
fuente
En mi caso, seguí las sugerencias anteriores, pero mi texto seguía truncado en una sola línea, aunque solo en horizontal. Resulta que encontré un
\0
personaje nulo invisible en el texto de la etiqueta que era el culpable. Debe haberse introducido junto con el símbolo del guión que había insertado. Para ver si esto también está sucediendo en su caso, use Ver depurador para seleccionar su etiqueta e inspeccionar su texto.fuente
Xcode 9.2:
Simplemente establezca el número de líneas en 0. Storyboard se verá extraño después de configurar esto. No te preocupes, ejecuta el proyecto. Mientras se ejecuta, todo cambiará de tamaño de acuerdo con la configuración de su guión gráfico. Creo que es un tipo de error en el guión gráfico.
Consejos: establezca "número de revestimiento en 0" en el último. reinícielo cuando desee editar alguna otra vista y configúrelo en 0 después de la edición.
fuente
¡Qué funcionó para mí!
stackview: alineación: relleno, distribución: relleno, restricción ancho proporcional a la supervista ej. 0.8,
etiqueta: centro y líneas = 0
fuente
Para cualquiera que todavía no pueda hacer que funcione. Intente configurar Autoshrink con una Escala de fuente mínima en ese UILabel.
Captura de pantalla de la configuración de UILabel Autoshrink
fuente
Es casi como la respuesta de @ Andy, pero puedes agregar tu trabajo
UILabel
extraUIStackview
y vertical para mí.fuente
Para mí, el problema era que la altura de la vista de la pila era simplemente demasiado corta. La vista de la pila y la etiqueta se configuraron correctamente para permitir que la etiqueta tenga varias líneas, pero la etiqueta fue la primera víctima de la compresión de contenido que la vista de la pila utilizó para que su altura fuera lo suficientemente pequeña.
fuente