Tengo problemas para tratar de lograr un comportamiento de diseño muy básico con Auto Layout. Mi controlador de vista se ve así en IB:
La etiqueta superior es la etiqueta del título, no sé cuántas líneas será. Necesito la etiqueta del título para mostrar todas las líneas de texto. También necesito que las otras dos etiquetas y la pequeña imagen se coloquen justo debajo del título, sin importar cuán alto sea. He establecido restricciones de espacio vertical entre las etiquetas y la imagen pequeña, así como una restricción de espacio superior entre la etiqueta del título y su supervista y una restricción de espacio inferior entre la imagen pequeña y su supervista. La UIView blanca no tiene restricción de altura, por lo que debe estirarse verticalmente para contener sus subvistas. He establecido el número de líneas para la etiqueta del título en 0.
¿Cómo puedo hacer que la etiqueta del título cambie de tamaño para ajustarse al número de líneas requeridas por la cadena? Entiendo que no puedo usar los métodos setFrame porque estoy usando Auto Layout. Y tengo que usar el diseño automático porque necesito esas otras vistas para permanecer debajo de la etiqueta del título (de ahí las restricciones).
¿Cómo puedo hacer que esto suceda?
fuente
Respuestas:
El uso
-setPreferredMaxLayoutWidth
enUILabel
y autolayout debería manejar el resto.Consulte la documentación de UILabel en preferredMaxLayoutWidth .
Actualizar:
Solo es necesario establecer la
height
restricción en el guión gráfico aGreater than or equal to
, no es necesario establecerPreferredMaxLayoutWidth.fuente
preferredMaxLayoutWidth
y ver devetc.org/code/2014/07/07/auto-layout-and-views-that-wrap.html para una breve pero informativa redacción, completa con GIF animados (no es mi escrito, lo encontré a través de Google)Expanda el número de líneas del conjunto de etiquetas a 0 y, lo que es más importante, para la altura del conjunto de diseño automático a> = x. El diseño automático hará el resto. También puede contener sus otros elementos basados en el elemento anterior para posicionarlos correctamente.
fuente
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.
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:
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.
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.
fuente
Estaba luchando con este escenario exacto, pero con bastantes vistas más que debían cambiar de tamaño y bajar según fuera necesario. Me estaba volviendo loco, pero finalmente lo descubrí.
Aquí está la clave: a Interface Builder le gusta agregar restricciones adicionales a medida que agrega y mueve vistas y es posible que no lo note. En mi caso, tenía una vista a mitad de camino que tenía una restricción adicional que especificaba el tamaño entre ella y su supervista, básicamente fijándola en ese punto. Eso significaba que nada por encima podría cambiar su tamaño porque iría en contra de esa restricción.
Una manera fácil de saber si este es el caso es tratando de cambiar el tamaño de la etiqueta manualmente. ¿IB te deja crecer? Si es así, ¿se mueven las etiquetas a continuación como esperabas? Asegúrese de haber marcado ambos antes de cambiar el tamaño para ver cómo sus restricciones moverán sus vistas:
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 supervisar la restricción. Luego, solo asegúrese de que su opción de número de líneas para la etiqueta esté establecida en 0 y que se haga cargo del resto.
fuente
Creo que necesitas lo siguiente:
fuente
Ninguna de las diferentes soluciones encontradas en los muchos temas sobre el tema funcionó perfectamente para mi caso (x etiquetas dinámicas multilínea en celdas de vista de tabla dinámica).
Encontré una manera de hacerlo:
Después de haber establecido las restricciones en su etiqueta y establecer su propiedad multilínea en 0, cree una subclase de UILabel; Llamé a la mía AutoLayoutLabel:
fuente
Tengo un UITableViewCell que tiene una etiqueta de ajuste de texto. Trabajé el ajuste de texto de la siguiente manera.
1) Establezca las restricciones de UILabel de la siguiente manera.
2) Establecer no. de líneas a 0.
3) Se agregó la restricción de altura UILabel a UITableViewCell.
4) En UITableViewCell:
fuente
Una forma de hacer esto ... A medida que aumenta la longitud del texto, intente cambiar (disminuir) el tamaño de fuente del texto de la etiqueta usando
fuente