Lors de l'utilisation de la disposition automatique dans le code, la définition du cadre ne fait rien. Donc, le fait que vous ayez spécifié une largeur de 200 sur la vue ci-dessus ne veut rien dire lorsque vous définissez des contraintes dessus. Pour que l'ensemble de contraintes d'une vue soit sans ambiguïté, il lui faut quatre choses: une position x, une position y, une largeur et une hauteur pour un état donné.
Actuellement dans le code ci-dessus, vous n'en avez que deux (hauteur, par rapport à la vue supervisée, et position y, par rapport à la vue supervisée). En plus de cela, vous avez deux contraintes requises qui peuvent entrer en conflit en fonction de la configuration des contraintes de la vue supervisée de la vue. Si le superview devait avoir une contrainte obligatoire qui spécifie que sa hauteur est une valeur inférieure à 748, vous obtiendrez une exception "contraintes non satisfaites".
Le fait que vous ayez défini la largeur de la vue avant de définir des contraintes ne signifie rien. Il ne prendra même pas en compte l'ancien cadre et calculera un nouveau cadre en fonction de toutes les contraintes qu'il a spécifiées pour ces vues. Lorsque je traite de la mise en page automatique dans le code, je crée généralement une nouvelle vue en utilisant initWithFrame:CGRectZero
ou simplement init
.
Pour créer le jeu de contraintes requis pour la mise en page que vous avez décrite verbalement dans votre question, vous devez ajouter des contraintes horizontales pour délimiter la largeur et la position x afin de donner une mise en page entièrement spécifiée:
[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 description verbale de cette disposition se lit comme suit en commençant par la contrainte verticale:
myView remplira la hauteur de sa supervision avec un rembourrage haut et bas égal à l'espace standard. Le superview de myView a une hauteur minimale de 748 points. La largeur de myView est de 200 points et a un remplissage à droite égal à l'espace standard par rapport à sa vue de dessus.
Si vous souhaitez simplement que la vue remplisse toute la hauteur de la vue supervisée sans contraindre la hauteur de la vue supervisée, vous omettez simplement le (>=748)
paramètre dans le texte au format visuel. Si vous pensez que le (>=748)
paramètre est nécessaire pour lui donner une hauteur - vous ne le faites pas dans ce cas: épingler la vue sur les bords de la vue supervisée en utilisant la syntaxe bar ( |
) ou bar avec espace ( |-
, -|
), vous donnez à votre vue un y -position (épinglant la vue sur un seul bord), et une position y avec la hauteur (épinglant la vue sur les deux bords), satisfaisant ainsi votre jeu de contraintes pour la vue.
En ce qui concerne votre deuxième question:
En utilisant NSDictionaryOfVariableBindings(self.myView)
(si vous aviez une configuration de propriété pour myView) et en l'introduisant dans votre VFL à utiliser self.myView
dans votre texte VFL, vous obtiendrez probablement une exception lorsque la mise en page automatique essaiera d'analyser votre texte VFL. Cela a à voir avec la notation par points dans les clés du dictionnaire et le système essayant d'utiliser valueForKeyPath:
. Voir ici pour une question et une réponse similaires .