Redimensionner vue actuelle à l'aide de NSLayoutConstraints
Je suis en train de définir la mise en page d'une vue à l'aide de NSLayoutConstraint
s.
Je peut mettre les choses en place au sein de l'afficher correctement, mais j'ai aussi besoin d'être en mesure de redimensionner l'affichage actuel (celui que je suis en définissant les contraintes d') si les contraintes exigent. En d'autres termes, je veux mettre un contenu fixe la taille souple de la fenêtre, plutôt que l'inverse.
Donc en gros, j'ai:
NSDictionary *views = [NSDictionary dictionaryWithObjectsAndKeys:self.v1, @"v1",
self.v2, @"v2",
nil];
//Set horizontal constraints
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|-[v1]-|"
options:0
metrics:nil
views:views]];
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|-[v2]-|"
options:0
metrics:nil
views:views]];
//Set vertical constraints
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[v1]-[v2]-|"
options:0
metrics:nil
views:views]];
//Initialise height constraint for v1
self.v1Height = [NSLayoutConstraint constraintWithItem:self.v1
attribute:NSLayoutAttributeHeight
relatedBy:NSLayoutRelationEqual
toItem:nil
attribute:NSLayoutAttributeNotAnAttribute
multiplier:1
constant:50];
Si plus tard, j'ai changer self.v1Height
(en l'enlevant, le recréer, et puis réinstallant), je voudrais le cadre de self
pour développer (ou contrat) pour tenir compte de la modification de la hauteur.
Je ne sais pas si c'est pertinent, je suis plus familier avec iOS à OS X), mais c'est l'affichage du contenu d'un NSPopover
.
Quelle contrainte dois-je ajouter pour y parvenir?
OriginalL'auteur sapi | 2013-06-16
Vous devez vous connecter pour publier un commentaire.
Il ya un couple de questions:
Si vous voulez que vos contraintes pour définir la taille de leur contenant de vue, ils ne peuvent pas être ambigu, comme ils le sont maintenant. Ils ont pour définir complètement l'espace dont ils ont besoin. Par exemple:
Remarque, je suis réglage de la largeur de
v1
, je suisv2
être de la même largeur quev1
, et je suis le réglage de la hauteur dev2
, aussi. Ce qui, combiné avec votre création subséquente de lav1Height
contrainte, rend maintenant le point de vue de la mise en page sans ambiguïté.Après avoir fait cela, vous devez également indiquer votre point de vue contrôleur d'informer la liste contrôleur de son contenu, la taille lors de la mise en page automatique a été appliquée. Donc, votre point de vue contrôleur peut mettre en œuvre une
viewDidLayoutSubviews
:Noter que le réglage de la
frame
est très curieux, mais si vous ne réinitialisez l'origine de{0.0, 0.0}
, vos commandes ne s'affichent pas dans le bon endroit. Il ne semble pas juste que vous avez à faire cela, mais dans mon expérience, vous ne.Un peu sans rapport avec votre problème, vous mentionnez que vous êtes en train de retirer
v1Height
"en l'enlevant, le recréer, et puis réinstallant ça". C'est inutile et n'est pas recommandé. Leconstant
propriété est modifiable. Comme le docs direAinsi, ce qui signifie que vous pouvez faire quelque chose d'aussi simple que:
.constant
). Cependant, comme il s'avère, ma principale erreur a été de beaucoup plus fondamental que cela (voir ma réponse)Hey, si cela a fonctionné pour vous, c'est génial. J'ai peut-être mal compris la question. Ma réponse ci-dessus décrit la façon dont vous obtenez une liste de l'image à modifier sur la base de complet contraintes sur les points de vue au sein de cette liste. Je suis maintenant à déduire de votre solution que ce n'est pas ce que vous essayiez de faire, mais plutôt juste pour essayer de résoudre le problème bien plus simple que d'essayer de s'assurer que les sous-vues,
v1
etv2
pour ajuster parfaitement le cadre de votre liste, pour lequel vous répondez est une excellente solution. Bravo et félicitations.c'était en fait une combinaison de ces deux choses. J'avais d'abord essayé quelque chose de similaire à votre solution, mais a constaté que la liste ne serait pas ajuster son contenu (bien que ce serait pousser). Cela s'est avéré être parce que j'ai mis
translatesAutoresizingMaskIntoConstraints
àNO
, comme je le fais habituellement pour la mise en page automatiqueOriginalL'auteur Rob
Comme il s'avère,
NSPopoverController
est une exception à la règle, ettranslatesAutoresizingMaskIntoConstraints
doit êtreYES
pour la mise en page automatique pour fonctionner correctement.OriginalL'auteur sapi
Mieux tard que jamais...
De Storyboard, de l'IB et Swift:
Juste à glisser votre contrainte comme n'importe quel autre contrôle de votre viewController
alors simplement la changer:
C'est tout!
OriginalL'auteur Luismi
J'ai trouvé une solution facile à mettre à jour les contraintes (redimensionner ) avec une catégorie:
Masquer mise en page automatique UIView : Comment obtenir des NSLayoutConstraint de mettre à jour cette une
OriginalL'auteur Damien Romito