cambie el tamaño de la vista de supervisión después de que las subenviaturas cambien dinámicamente con autoajuste

No puedo por el amor de Dios el colgar de esta vista de supervisión 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 es dynamic proveniente de la database.

SizeToFit vs SizeThatFits:(CGSize) vs UIView systemLayoutSizeFittingSize: pasando ya sea UILayoutFittingCompressedSize o UILayoutFittingExpandedSize .

Utilizo automáticamente la reproducción automática y he configurado la altura de la supervisión para que sea igual o mayor a un número ficticio.

dónde y cómo utilizo estos SizeToFit vs sizeThatFits:(CGSize) vs UIView systemLayoutSizeFittingSize: pasando UILayoutFittingCompressedSize o UILayoutFittingExpandedSize . He leído muchos consejos aquí en la stack, pero terminé sin nada.

¿Debo recalcular las restricciones para la supervisión en algún lugar específico. ¿Maby configuró la altura para que sea '@ propiedad' en su class de controller y la elimine y la lead? Cajero He intentado poner todo en todas partes y luego en algunos. Aún así obtengo el resultado final del mismo tamaño con la altura ficticia y el text flotando afuera. Incluso después de configurar clipsToBound en subvista.

Me estoy rascando el cabello de … ayuda

Si está utilizando Auto Layout, esto es lo que debe hacer:

  1. Asegúrese de no agregar restricciones de ancho y / o altura fijas a ninguna de sus sub-vistas (dependiendo de qué dimensión (s) desea dimensionar dinámicamente). La idea es dejar que el tamaño de contenido intrínseco de cada subvista determine la altura de la subvista. UILabel viene con 4 restricciones implícitas automáticas que intentarán (con less de la prioridad requerida) mantener el marco de la label con el tamaño exacto requerido para adaptarse a todo el text dentro.

  2. Asegúrese de que los bordes de cada label estén conectados rígidamente (con restricciones de prioridad obligatorias) a los bordes de cada uno y a su supervisión. Desea asegurarse de que si se imagina que una de las tags crece en tamaño, esto forzaría a las otras tags a dar cabida y, lo que es más importante, forzaría a la supervisión a expandirse también.

  3. Solo agregue restricciones a la vista de supervisión para establecer su position, no el tamaño (al less, no para la (s) dimensión (es) que desea que tome el tamaño dinámicamente). Recuerde que si establece correctamente las restricciones internas, su tamaño estará determinado por los tamaños de todas las subvistas, ya que sus bordes están conectados de alguna manera a los suyos.

Eso es. No necesita llamar a sizeToFit o sizeToFit systemLayoutSizeFittingSize: para que esto funcione, simplemente cargue sus vistas y configure el text y eso debería ser. El motor de layout del sistema hará los cálculos para que usted pueda resolver sus restricciones. (En todo caso, es posible que deba llamar a setNeedsLayout en la supervisión … pero esto no debería ser obligatorio).

Utilizar vistas de contenedor

En el siguiente ejemplo, tengo una image de 30×30, y la UILabel es más pequeña que la vista que contiene el text del marcador de position. Necesitaba que la vista contenedora fuera al less tan grande como la image, pero necesitaba crecer para contener text de varias líneas.

En formatting 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 que contiene para que coincida con la altura de la label. Ahora la vista que contiene tendrá el tamaño de la label.

Como @smileyborg señaló en su respuesta, conectar el contenido rígidamente a la supervisa informa al motor de layout que la simple vista del contenedor debería hacer que crezca.

Rectangularjs de alignment amarilla

Si desea que los rectangularjs de alignment amarillos agreguen -UIViewShowAlignmentRects YES en la list de arguments de ejecución de su esquema.

UILabel que es multilínea

Esto se simplificó enormemente con la introducción de Vistas de stack en iOS 9. Usa una vista de stack dentro de tu vista para contener todo tu contenido que cambia de tamaño y luego simplemente llama

 view.setNeedsUpdateConstraints() view.updateConstraintsIfNeeded() view.setNeedsLayout() view.layoutIfNeeded() 

Después de cambiar tu contenido. Entonces puedes get tu nuevo tamaño llamando

 view.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize) 

Si alguna vez necesita calcular el tamaño exacto requerido para una vista.

Esto casi sigue la respuesta de @smileyborg y viene con un ejemplo concreto.

introduzca la descripción de la imagen aquí

No describirá todas las restricciones, sino aquellas relacionadas con el cálculo de la altura de los objects de la interfaz de usuario.

  1. [Etiqueta] Las tags no deben tener una restricción de height fija, en este caso, AutoLayout no cambiará el tamaño de las tags para ajustarse al text, por lo que las restricciones de borde de ajuste son la key. (flechas verdes)
  2. [Subview] Los pasos 1 y 3 son muy fáciles de seguir, pero este paso puede malentenderse. Como en el caso de las tags, las subvistas no deben tener un set de limitaciones de height . Todas las subvenciones deben tener el set de restricciones top , ignorando la restricción de bottom , lo que puede hacer pensar que desencadenará una exception de restricción no satisdate en time de ejecución, pero no lo hará si establece la restricción bottom para la última subvista. Faltando para hacerlo volará el layout. (flechas rojas)

  3. [Supervisión] Establezca todas las restricciones de la manera que necesite, pero preste mucha atención a la restricción de height . Asigne un valor aleatorio, pero hágalo opcional, AutoLayout establecerá la altura exactamente para ajustarse a las subvistas. (flechas azules)

Esto funciona perfectamente, no es necesario llamar a ningún método adicional de actualización de layout del sistema.