Cuando se usa el diseño automático en el código, configurar el marco no hace nada. Por lo tanto, el hecho de que haya especificado un ancho de 200 en la vista anterior no significa nada cuando le establece restricciones. Para que el conjunto de restricciones de una vista no sea ambiguo, necesita cuatro cosas: una posición x, una posición y, un ancho y una altura para cualquier estado dado.
Actualmente, en el código anterior, solo tiene dos (altura, relativa a la supervista, y posición y, relativa a la supervista). Además de esto, tiene dos restricciones requeridas que podrían entrar en conflicto dependiendo de cómo se configuren las restricciones de la supervista de la vista. Si la supervista tuviera una restricción requerida que especifique que su altura debe tener un valor menor que 748, obtendrá una excepción de "restricciones insatisfactorias".
El hecho de que haya establecido el ancho de la vista antes de establecer restricciones no significa nada. Ni siquiera tendrá en cuenta el marco anterior y calculará un marco nuevo en función de todas las restricciones que ha especificado para esas vistas. Cuando trato con el diseño automático en el código, normalmente solo creo una nueva vista usando initWithFrame:CGRectZero
o simplemente init
.
Para crear el conjunto de restricciones requerido para el diseño que describió verbalmente en su pregunta, necesitaría agregar algunas restricciones horizontales para delimitar el ancho y la posición x para dar un diseño completamente especificado:
[self.view addConstraints:[NSLayoutConstraint
constraintsWithVisualFormat:@"V:|-[myView(>=748)]-|"
options:NSLayoutFormatDirectionLeadingToTrailing
metrics:nil
views:NSDictionaryOfVariableBindings(myView)]];
[self.view addConstraints:[NSLayoutConstraint
constraintsWithVisualFormat:@"H:[myView(==200)]-|"
options:NSLayoutFormatDirectionLeadingToTrailing
metrics:nil
views:NSDictionaryOfVariableBindings(myView)]];
La descripción verbal de este diseño es la siguiente, comenzando con la restricción vertical:
myView llenará la altura de su supervista con un relleno superior e inferior igual al espacio estándar. La supervista de myView tiene una altura mínima de 748pts. El ancho de myView es 200pts y tiene un relleno derecho igual al espacio estándar contra su supervista.
Si simplemente desea que la vista llene la altura de la supervista completa sin restringir la altura de la supervista, entonces simplemente omitiría el (>=748)
parámetro en el texto del formato visual. Si cree que el (>=748)
parámetro es necesario para darle una altura, no lo hace en este caso: anclar la vista a los bordes de la supervista usando la barra ( |
) o la barra con espacio ( |-
,-|
sintaxis de ), está dando su vista a y -posición (fijar la vista en un solo borde) y una posición y con altura (fijar la vista en ambos bordes), satisfaciendo así su conjunto de restricciones para la vista.
En cuanto a su segunda pregunta:
Utilizando NSDictionaryOfVariableBindings(self.myView)
(si tuviera una configuración de propiedad para myView) y la alimentación que en su VFL a utilizar self.myView
en el texto VFL, es probable que obtener una excepción cuando autolayout intenta analizar el texto VFL. Tiene que ver con la notación de puntos en las claves del diccionario y el sistema que intenta usar valueForKeyPath:
. Vea aquí una pregunta y una respuesta similares .