No puedo, por el amor de Dios, el truco de esta supervista de cambio de tamaño.
Tengo una UIView *superview con 4 UILabels. 2 funcionan como encabezado para los otros 2.
El contenido de los 4 son dinámicos provenientes de la base de datos.
SizeToFitvs SizeThatFits:(CGSize)vs UIView systemLayoutSizeFittingSize:, pasando ya sea UILayoutFittingCompressedSizeo UILayoutFittingExpandedSize.
Utilizo el diseño automático mediante programación y he configurado la altura de la supervista para que sea igual o mayor a un número ficticio.
dónde y cómo uso estos SizeToFitvs sizeThatFits:(CGSize)vs UIView systemLayoutSizeFittingSize:, pasando ya sea UILayoutFittingCompressedSizeoUILayoutFittingExpandedSize . He leído muchos consejos aquí en la pila pero terminé sin nada.
DEBO volver a calcular las restricciones para la supervista en algún lugar específico. ¿Puede establecer la altura en ´ @ property` en su clase de controlador y eliminarla y leerla? Atm he intentado poner todo en todas partes y algo más. Aún así, obtengo el resultado final del mismo tamaño con la altura ficticia y el texto flotando afuera. Incluso después de configurar clipsToBound en subview.
Me estoy rascando el pelo de .. ayuda
fuente

Respuestas:
Si está utilizando Diseño automático, esto es lo que debe hacer:
Asegúrese de no agregar restricciones fijas de ancho y / o alto a ninguna de sus subvistas (según las dimensiones que desee dimensionar dinámicamente). La idea es permitir que el tamaño del contenido intrínseco de cada subvista determine la altura de la subvista.
UILabels vienen con 4 restricciones implícitas automáticas que intentarán (con menos de la prioridad Requerida) mantener el marco de la etiqueta en el tamaño exacto requerido para que quepa todo el texto dentro.Asegúrese de que los bordes de cada etiqueta estén conectados rígidamente (con las restricciones de prioridad requeridas) a los bordes entre sí y a su supervista. Desea asegurarse de que si imagina que una de las etiquetas aumenta de tamaño, esto obligaría a las otras etiquetas a dejar espacio para ella y, lo que es más importante, obligaría a la supervista a expandirse también.
Solo agregue restricciones a la supervista para establecer su posición, no el tamaño (al menos, no para las dimensiones que desea que se dimensionen dinámicamente). Recuerde que si configura correctamente las restricciones internas, su tamaño estará determinado por los tamaños de todas las subvistas, ya que sus bordes están conectados a los de ellos de alguna manera.
Eso es. No necesita llamar
sizeToFitosystemLayoutSizeFittingSize:hacer que esto funcione, simplemente cargue sus vistas y configure el texto y eso debería ser todo. El motor de diseño del sistema hará los cálculos para que usted resuelva sus limitaciones. (En todo caso, es posible que deba llamarsetNeedsLayouta la supervista ... pero esto no debería ser necesario).fuente
constraintsWithVisualFormaty entiendo totalmente su punto sobre las subvistas que contienen, estirando y empujando la supervista a su tamaño :) Gracias de nuevotranslatesAutoresizingMaskIntoConstraints = NOsi está usando xib.Usar vistas de contenedor
En el siguiente ejemplo, tengo una imagen de 30x30 y
UILabeles más pequeña que la vista que contiene el texto del marcador de posición. Necesitaba que la vista contenedora fuera al menos tan grande como la imagen, pero necesitaba crecer para contener texto de varias líneas.En formato visual, el contenedor interno se ve así:
H:|-(15.0)-[image(30.0)]-(15.0)-[label]-(15.0)-| V:|[image(30.0)]| V:|[label(>=30.0)]|Luego, configure la vista contenedora para que coincida con la altura de la etiqueta. Ahora la vista contenedora se ajustará al tamaño de la etiqueta.
Como @smileyborg señaló en su respuesta, conectar el contenido de manera rígida a la supervista informa al motor de diseño que la vista de contenedor simple debería hacer que crezca.
Rectángulos de alineación amarillos
Si desea que los rectángulos de alineación amarillos agreguen
-UIViewShowAlignmentRects YESen la lista de argumentos de ejecución de su esquema.fuente
-UIViewShowAlignmentRects YES- ¡gran consejo!Esto se hizo mucho más fácil con la introducción de Stack Views en iOS 9. Use una vista de pila dentro de su vista para contener todo su contenido que cambia de tamaño, y luego simplemente llame
después de cambiar su contenido. Entonces puede obtener su nueva talla llamando
view.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize)si alguna vez necesita calcular el tamaño exacto requerido para una vista.
fuente
Esto casi sigue la respuesta de @smileyborg y viene con un ejemplo concreto.
No describirá todas las restricciones, sino las relacionadas con el cálculo de la altura de los objetos de la interfaz de usuario.
heightrestricción fija , en este caso, AutoLayout no cambiará el tamaño de las etiquetas para que se ajusten al texto, por lo que establecer restricciones de borde es la clave. (flechas verdes)[Subvista] Los pasos 1 y 3 son muy fáciles de seguir, pero este paso puede malinterpretarse. Como en el caso de las etiquetas, las subvistas no deben tener
heightrestricciones establecidas. Todas las subvistas deben tener untopconjunto de restricciones, ignorando labottomrestricción, lo que puede hacerle pensar que desencadenará una excepción de restricción insatisfecha en tiempo de ejecución, pero no lo hará si establece unabottomrestricción para la última subvista. No hacerlo arruinará el diseño. (flechas rojas)[Supervista] Establezca todas las restricciones de la forma que necesite, pero preste mucha atención a las
heightrestricciones. Asígnele un valor aleatorio, pero hágalo opcional, AutoLayout establecerá la altura exactamente para adaptarse a las subvistas. (flechas azules)Esto funciona perfectamente, no es necesario llamar a ningún método adicional de actualización del diseño del sistema.
fuente