Al usar el diseño automático en el código, al establecer el marco no se hace nada. Por lo tanto, el hecho de que haya especificado un ancho de 200 en la vista anterior no significa nada cuando establece restricciones en él. Para que la restricción de una vista sea inequívoca, 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 (alto, relativo a la supervista, y posición y, relativo a la supervista). Además de esto, tiene dos restricciones obligatorias que podrían entrar en conflicto dependiendo de cómo se configuran las restricciones de la vista de la vista. Si la supervista tuvieran una restricción requerida que especifique que su altura sea un valor inferior a 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 tomará en cuenta el marco anterior y calculará un nuevo marco basado en todas las restricciones que ha especificado para esas vistas. Cuando se trata de autolayout en el código, normalmente solo creo una nueva vista usando initWithFrame:CGRectZero
o simplemente init
.
Para crear el conjunto de restricciones necesarias para la composición que ha descrito verbalmente en su pregunta, usted tendría que añadir algunas restricciones horizontales para limitar el ancho y la posición X con el fin de darle un diseño completamente especificada:
[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)]];
verbalmente describir esta disposición dice lo siguiente a partir de la restricción vertical:
myView llenará la altura de su supervista con un acolchado superior e inferior igual al espacio estándar. La supervista de myView tiene una altura mínima de de 748pts. El ancho de myView es de 200pts y tiene un margen derecho igual a el espacio estándar contra su superview.
Si simplemente como el fin de llenar la altura de toda la supervista sin limitar la altura de la supervista, entonces sería simplemente omitir el parámetro (>=748)
en el texto formato visual.Si cree que se necesita el parámetro (>=748)
para darle una altura, no lo hace en esta instancia: fijando la vista a los bordes de la supervista usando la barra (|
) o la barra con espacio (|-
, -|
) sintaxis, está dando su vista en una posición y (fijando la vista en un solo borde), y una posición y en altura (fijando la vista en ambos bordes), satisfaciendo así su conjunto de restricciones para la vista.
En lo que respecta a su segunda pregunta:
Uso NSDictionaryOfVariableBindings(self.myView)
(si tuviera una configuración de propiedad para myView) y la alimentación que en su VFL utilizar self.myView
en su texto VFL, es probable que obtener una excepción cuando autolayout intentos para analizar su texto VFL. Tiene que ver con la notación de punto en las teclas del diccionario y el sistema que intenta usar valueForKeyPath:
. See here for a similar question and answer.
Lo que es vivi en el código anterior? – iDev
Cambie el título a "iOS" en lugar de "IOS": este último se refiere al sistema operativo de conmutador/enrutador de Cisco. Me confundió. Gracias. – armani
Varias preguntas sobre esto: (1) ¿Qué error está obteniendo cuando "no satisface algunas restricciones"? (2) ¿Está traduciendo el autoajuste a restricciones en 'myView'? (3) ¿Qué es 'vivi' (como preguntó ACB)? (4) ¿Tiene una propiedad 'myView' declarada en' self'? – Tim