Entiendo que el autolayout es que toma el tamaño de la supervista y se basa en restricciones y tamaños intrínsecos, calcula las posiciones de las subvistas.
¿Hay alguna manera de revertir este proceso? Quiero cambiar el tamaño de la supervista sobre la base de restricciones y tamaños intrínsecos. ¿Cuál es la forma más sencilla de lograr esto?
Tengo una vista diseñada en Xcode que utilizo como encabezado UITableView
. Esta vista incluye una etiqueta y un botón. El tamaño de la etiqueta difiere según los datos. Dependiendo de las restricciones, la etiqueta presiona con éxito el botón hacia abajo o si hay una restricción entre el botón y la parte inferior de la supervista, la etiqueta se comprime.
He encontrado algunas preguntas similares, pero no tienen respuestas buenas y fáciles.
Respuestas:
La API correcta para usar es
UIView systemLayoutSizeFittingSize:
, pasando cualquieraUILayoutFittingCompressedSize
oUILayoutFittingExpandedSize
.Para una
UIView
distribución automática normal, esto debería funcionar siempre que sus restricciones sean correctas. Si desea usarlo en unUITableViewCell
(para determinar la altura de la fila, por ejemplo), debe llamarlo contra su celdacontentView
y tomar la altura.Existen otras consideraciones si tiene uno o más UILabel en su punto de vista que son multilínea. Para estos es imperitivo que la
preferredMaxLayoutWidth
propiedad se establezca correctamente de modo que la etiqueta proporcione una correctaintrinsicContentSize
, que se utilizará en elsystemLayoutSizeFittingSize's
cálculo.EDITAR: por solicitud, agregando un ejemplo de cálculo de altura para una celda de vista de tabla
El uso de la distribución automática para el cálculo de la altura de la celda de la tabla no es súper eficiente, pero sin duda es conveniente, especialmente si tiene una celda que tiene un diseño complejo.
Como dije anteriormente, si está utilizando una línea múltiple
UILabel
, es imprescindible sincronizarlopreferredMaxLayoutWidth
con el ancho de la etiqueta. Yo uso unaUILabel
subclase personalizada para hacer esto:Aquí hay una subclase inventada de UITableViewController que demuestra heightForRowAtIndexPath:
Una celda personalizada simple:
Y, aquí hay una imagen de las restricciones definidas en el Storyboard. Tenga en cuenta que no hay restricciones de alto / ancho en la etiqueta, que se infieren de las etiquetas
intrinsicContentSize
:fuente
sizingCell
o sucontentView
.sizingCell
ancho coincida con sutableView
ancho.El comentario de Eric Baker me indicó la idea central de que para que una vista tenga su tamaño determinado por el contenido colocado dentro de ella, entonces el contenido colocado dentro de ella debe tener una relación explícita con la vista que lo contiene para impulsar su altura (o ancho) dinámicamente . "Agregar subvista" no crea esta relación como podría suponer. Debe elegir qué subvista va a controlar la altura y / o el ancho del contenedor ... más comúnmente cualquier elemento de la interfaz de usuario que haya colocado en la esquina inferior derecha de su interfaz de usuario general. Aquí hay algunos códigos y comentarios en línea para ilustrar el punto.
Tenga en cuenta que esto puede ser de valor particular para aquellos que trabajan con vistas de desplazamiento, ya que es común diseñar alrededor de una sola vista de contenido que determina su tamaño (y lo comunica a la vista de desplazamiento) dinámicamente en función de lo que haya agregado. Buena suerte, espero que esto ayude a alguien por ahí.
fuente
Puede hacer esto creando una restricción y conectándola a través del generador de interfaces
Ver explicación: Auto_Layout_Constraints_in_Interface_Builder
raywenderlich begin-auto-layout
AutolayoutPG Artículos restricción Fundamentos
conecte esta salida de Restricción con su Restricción de subvista o conecte Super Restricción también y configúrela de acuerdo con sus requisitos de esta manera
Espero que esto lo aclare.
fuente
Esto se puede hacer para una normal
subview
dentro de una más grandeUIView
, pero no funciona automáticamenteheaderViews
. La altura de aheaderView
está determinada por lo que devuelve, portableView:heightForHeaderInSection:
lo que debe calcularla enheight
funciónheight
delUILabel
espacio más para elUIButton
y cualquierpadding
cosa que necesite. Necesitas hacer algo como esto:Aquí
headerString
está la cadena que desea llenarUILabel
, y el número 281 es elwidth
deUILabel
(como se configuró enInterface Builder
)fuente