Utilizando autolayout en iOS, ¿cómo puedo especificar que una vista ocupe tanto espacio como sea posible?

Estoy usando autolayout en iOS para intentar crear un layout con anchos de fluidos. El formatting visual para la restricción que estoy usando actualmente es:

[self.scrollViewContainer addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(>=32)-[viewToAdd(<=576)]-(>=32)-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(viewToAdd) ]]; 

Es decir: quiero un espacio mínimo de 32px en cualquier lado, y quiero que el viewToAdd tenga un ancho máximo de 576px. Esto funciona bien, excepto que quiero que la vista viewToAdd use cualquier espacio disponible mientras cumple todas las restricciones. Actualmente obtengo el viewToAdd solo siendo tan amplio como su tamaño de contenido intrínseco, y el espaciado crece según sea necesario.

¿Hay alguna forma de especificar que viewToAdd sea ​​lo más grande posible?

Tendrá que especificar restricciones adicionales en la vista para que el tamaño de la vista complete el espacio disponible restante. Actualmente, está configurando los mínimos y máximos de vista, pero sin establecer restricciones concretas para dar a la reproducción automática una solución más completa. Además del límite superior para el ancho, debe darle 1. un punto inicial para resolver el ancho de la vista, ya sea explícitamente dándole un ancho con una prioridad menor, o 2. darle el espacio a cada lado un poco más restricciones rígidas

Según lo que describiste, debes restringir tu vista para darle algunos enlaces más sustanciales a la vista de supervisión de cualquier lado para permitir que el sistema resuelva por el ancho. Dado que le gustaría tener el tamaño de vista en function del tamaño del contenedor, deberá modificar las restricciones de espacio (opción 2 desde arriba). En la instancia anterior, especificó solo un espacio mínimo, lo que daría como resultado que cualquiera de las siguientes soluciones de restricción sea válida para el motor de reproducción automática para una vista de supervisión de 400pt:

 |-32pt-[20pt]-------348pt-| <-- autolayout will probably choose this one |-100pt----[20pt]---280pt-| |-50pt--[20pt-]-----330pt-| 

Lo cual probablemente no es lo que quieres. Aún más, el ancho de la vista puede ser cualquier cosa entre 0-576pt, que probablemente tampoco sea lo que deseas. Como autolayout no sabe lo que quiere, simplemente usa el contenido intrinsicContentSize de la vista para las restricciones de tamaño concreto. Como eligió 32pt como espaciamiento, un primer paso sería darle a las restricciones espaciales algunas instrucciones más sustanciales, a saber, decirle al sistema que el espaciado debe ser de 32pts entre los bordes de la vista y la supervisión a less que el ancho de la vista sea > 576pts. Lo harías así en tu cadena VFL:

 "H:|-(>=32,==32@900)-[viewToAdd(<=576)]-(>=32,==32@900)-|" 

Esto dice: " viewToAdd debería tener un ancho máximo de 576pts y tener un relleno entre sí y una supervisión de 32pts. Si el tamaño de la supervisión crece más allá del ancho máximo de viewToAdd más el relleno inicial de 64pts, el relleno de ambos lados debería crecer para continuar resolviendo el set de restricciones ".

Esto resulta en las siguientes restricciones correctas para una supervisión de 400pt:

 |-32pt--[336pt]--32pt-| 

Si desea que viewToAdd permanezca centrado en su supervisión cuando la vista crezca más allá del máximo, deberá pasar la opción NSLayoutFormatAlignAllCenterX al parámetro de options en [NSLayoutConstraint -constraintsWithVisualFormat:] . Si no tenía la restricción >=32 establecida en el relleno, o no estableció una prioridad inferior a 1000 (nivel de prioridad de restricción "requerido") en la restricción de su relleno ==32 , su vista de supervisión sería incapaz de crecer más allá de 640pts .

No estoy seguro si esto responde exactamente la pregunta, pero para los que usan Storyboard: encontré que puedes agregar una restricción de ancho y restricciones tanto para la distancia a la izquierda como a la derecha de la vista principal, por ejemplo. Si luego cambia la restricción de ancho a '<=' en lugar de '=' y establece la prioridad de las restricciones de distancia (tanto de input como de salida) a 750, la vista se extenderá al máximo, respetando las restricciones de distancia si la vista es demasiado pequeña

Las restricciones en su lugar