À l'aide de mise en page automatique sur iOS comment puis-je spécifier que la vue doit prendre autant d'espace que possible?
Je suis en utilisant la mise en forme automatique dans iOS à essayer de construire une mise en page fluide largeurs. Le format visuel de la contrainte, je suis en cours d'utilisation est:
[self.scrollViewContainer addConstraints:[NSLayoutConstraint
constraintsWithVisualFormat:@"H:|-(>=32)-[viewToAdd(<=576)]-(>=32)-|"
options:0
metrics:nil
views:NSDictionaryOfVariableBindings(viewToAdd)
]];
C'est-à-dire: je veux un minimum de 32px l'espacement de chaque côté, et je veux le viewToAdd
avoir une largeur maximale de 576px. Cela fonctionne bien sauf que je veux le viewToAdd
à utiliser tout l'espace disponible, tout en respectant toutes les contraintes. Actuellement je reçois le viewToAdd
jamais être aussi large que son contenu intrinsèque de la taille et de l'espacement de la croissance en tant que de besoin.
Est-il un moyen de spécifier que le viewToAdd
doit être aussi large que possible?
Vous devez vous connecter pour publier un commentaire.
Vous allez avoir à spécifier des contraintes supplémentaires sur la vue pour obtenir de la taille de la vue de remplir tout l'espace disponible. Actuellement, vous êtes paramétrage de l'affichage des valeurs minimales et maximales, mais de ne pas fixer des contraintes de donner à mise en page automatique une solution plus complète. En plus de la limite supérieure de la largeur, vous avez besoin de lui donner 1. un point de départ pour résoudre la largeur de la vue en soit explicitement, en lui donnant une largeur d'au moins prioritaires, ou 2. donner l'espacement de chaque côté quelques plus de contraintes rigides.
Basé sur ce que vous avez décrit, vous devez imposer votre vision pour donner un peu plus importante pour les liaisons de la superview de chaque côté afin de laisser le système à résoudre pour la largeur. Depuis que vous aimeriez avoir la taille de la vue elle-même basée sur le conteneur de la taille, vous devrez modifier l'espacement des contraintes (option 2 ci-dessus). Dans l'exemple ci-dessus, vous avez défini un minimum d'espacement, qui serait la conséquence de la contrainte de trouver des solutions valables par la mise en page automatique du moteur pour un 400pt superview:
Qui n'est probablement pas ce que vous voulez. Plus encore, la largeur de la vue peut être n'importe quoi entre 0-576pt, qui est aussi probablement pas ce que vous êtes désireux. Depuis la mise en page automatique ne sais pas ce que vous voulez, c'est tout simplement à l'aide de la
intrinsicContentSize
de la vue pour le béton de dimensionnement des contraintes. Puisque vous avez choisi de 32 points que l'espacement, une première étape serait de donner à l'espacement des contraintes certaines plus importantes instructions, à savoir, dire au système que l'espacement devrait être 32pts entre les bords de la vue et de la superview sauf la largeur de la vue >576pts. Vous voulez faire cela comme si dans votre VFL chaîne:Ce dit: "
viewToAdd
doit avoir une largeur maximale de 576pts et ont un rembourrage entre lui-même et c'est superview de 32pts. Si la taille de la superview pousse au-delà de la largeur maximale deviewToAdd
ainsi que l'rembourrage de 64pts, le rembourrage sur les côtés devrait de se développer pour continuer à résoudre la contrainte."Cette résultats dans les contraintes suivantes est correcte pour un 400pt superview:
Si vous souhaitez pour
viewToAdd
de rester centré dans superview lorsque la vue se développe au-delà du maximum, vous aurez à passer dans l'optionNSLayoutFormatAlignAllCenterX
à laoptions
paramètre dans[NSLayoutConstraint -constraintsWithVisualFormat:]
. Si vous n'avez pas le>=32
contrainte sur le rembourrage, ou n'a pas définir une priorité inférieure à 1000 ("obligatoire" contrainte de niveau de priorité) sur votre rembourrage de==32
contrainte, alors votre superview serait pas en mesure de croître au-delà de 640pts.NSLayoutFormatAlignAllCenterX
pour le format visuel, et ont du centre de la vue dans le superview. Les options s'appliquent uniquement aux points de vue que vous avez explicitement mentionnés dans le format visuel de la chaîne. Il semble que vous allez avoir une autre contrainte explicite que les contraintes de la vue du centre de la superview du centre.[self.scrollViewContainer addConstraint:[NSLayoutConstraint constraintWithItem:viewToAdd attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self.scrollViewContainer attribute:NSLayoutAttributeCenterX multiplier:1.0 constant:0.0]];
Ne sais pas si cela exactement répond à la question, mais pour ceux qui utilisent des Storyboard: j'ai trouvé que vous pouvez ajouter une largeur de contrainte et les contraintes à la fois de la distance à gauche et à droite de la vue parent par exemple. Si vous modifiez la largeur de la contrainte de " <=' au lieu de '=' et de définir la priorité de la contrainte de distance (à la fois avant et arrière) à 750, vue max à la largeur maximale, en respectant la distance de contraintes si l'affichage est trop petit.