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
UILabelinterior de unUIView(Editor -> Incrustar en -> Ver)UILabela laUIView(por ejemplo, espacio final, espacio superior y espacio inicial para supervisar restricciones)Se
UIStackViewestiraráUIViewpara que se ajuste correctamente yUIViewrestringirá lasUILabellíneas múltiples.fuente
UIViewtravesuras necesarias.Para una vista de pila horizontal que tiene una
UILabelde 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
.fillse usa, la horizontalUIStackViewNO cambia de tamaño verticalmente usando los tamaños de subvistas organizados.fuente
.alignmentel UIStackView que debes configurar en cualquier cosa que.fillno sea UILabel, lo cual es un poco confuso en el ejemplo dadolabel.alignment = .center. Creo que esto debería serstackView.alignment = .centermultiLinemenos 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
preferredMaxLayoutWidthenviewDidLayoutSubviewssu etiqueta enUIViewControllero enlayoutSubviewssi subclaseUIView.Establecer PreferredMaxLayoutWidth en UILabel funcionó para mí
fuente
.centery 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
widthAnchoraUIStackView.Configuración
leadingAnchorytrailingAnchorno funcionará, pero la configuracióncenterXAnchorewidthAnchorhizo 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
UIStackViewcompuesta de líneasUILabelmú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
ViewControllerque lo usa.fuente
Agregar
UIStackViewpropiedades,En lugar de agregar una etiqueta dentro de la
UIViewcual 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 incrustarUILabelnada 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
\0personaje 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
UILabelextraUIStackviewy 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