Quand puis-je activer/désactiver les contraintes de mise en forme?

J'ai mis en place plusieurs ensembles de contraintes de l'IB, et j'aimerais par programme basculer entre eux en fonction de l'état. Il y a un constraintsA sortie de la collection qui sont toutes marquées comme étant installé à partir de l'IB, et un constraintsB sortie de la collection qui sont tous des désinstallé de l'IB.

Je peux par programme de basculer entre les deux ensembles comme:

NSLayoutConstraint.deactivateConstraints(constraintsA)
NSLayoutConstraint.activateConstraints(constraintsB)

Mais... je ne peux pas comprendre quand de le faire. Il semble que je devrais être capable de le faire une fois dans viewDidLoad, mais je ne peux pas obtenir que cela fonctionne. J'ai essayé d'appeler view.updateConstraints() et view.layoutSubviews() après la mise à l'contraintes, mais en vain.

Je l'ai fait savoir que si j'ai mis les contraintes dans viewDidLayoutSubviews tout fonctionne comme prévu. Je suppose que je voudrais savoir deux choses...

  1. Pourquoi suis-je ce problème?
  2. Est-il possible d'activer/désactiver les contraintes de viewDidLoad?
  • Entendez-vous le deactivateConstraints et activateConstraints travaillé dans viewWillLayoutSubviews? J'ai essayé, et ça n'a pas de travail là-bas ou dans viewDidLoad. Il a travaillé dans viewDidAppear; le point de vue est apparu où les nouvelles contraintes doit le mettre, mais si j'ai tourné vers le paysage, la vue est déplacé à la position déterminée par les contraintes de l'IB (et y est resté quand j'ai tourné le dos à portrait). L'enregistrement de l'contraintes, a montré les bons (ceux nouvellement activé). Cela semble être un bug pour moi.
  • oui il a travaillé pour moi dans viewWillLayoutSubviews. Peut-être les contraintes que vous avez essayé d'activer n'étaient pas valides? Ou peut-être oublié d'appeler super?
  • Oui, ils étaient valides (ils ont travaillé dans viewDidAppear), et il n'y a pas besoin d'appeler super car il n'y a pas de défaut de mise en œuvre de viewWillLayoutSubviews (je l'ai essayé avec un appel à super de toute façon, mais qui ne fait pas de différence).
  • De toute façon, je ne sais pas pourquoi cela ne fonctionnerait pas dans le viewDidLoad. J'ai ajouté des contraintes dans le passé, et qui fonctionne très bien.
  • Bizarre. J'espère qu'il y est une bonne réponse. J'aimerais mieux comprendre ce processus.
  • J'ai essayé une autre chose à vérifier qu'elle n'a pas un problème de synchronisation. J'ai appelé ces deux méthodes dans un timer de la méthode d'action qui a été appelé 2 secondes après viewDidLoad. J'ai obtenu les mêmes résultats que j'ai obtenu avec viewDidAppear -- le point de vue a été dans sa nouvelle position, mais est revenue sur la rotation.
  • Juste eu la chance d'aller tester plus... je peux vérifier j'ai effectivement eu le même comportement que vous avez décrit... travaille d'abord dans viewDidAppear, mais il reprend ensuite lors de la rotation.
  • Je me demande si, lorsque vous avez eu le succès ajout de contraintes de viewDidLoad si vous n'étiez pas à l'aide adaptative points de vue, mais maintenant vous êtes?
  • Apparemment, vous ne pouvez pas marquer les contraintes qu'il n'est pas installé dans l'IB à cette fin. Constaté que les renseignements ici: stackoverflow.com/questions/27663249/... et il a résolu le problème pour moi.
  • J'ai eu mes contraintes de mise en œuvre de la même manière que celle décrite dans la question, sauf que j'ai activé/désactivé certains d'entre eux dans viewDidAppear. Cela a fonctionné, mais vous pouvez voir les éléments de changer rapidement de position (un mineur, mais indésirable de l'émission). Le changement dans viewWillAppear ou viewDidLoad n'a pas de travail. Mais après la lecture de cette question, j'ai essayé de faire ce changement dans viewDidLayoutSubviews. Cela a fonctionné, et le changement de position n'est plus visible pour l'utilisateur. (Il a également travaillé dans viewWillLayoutSubviews). Donc merci pour cette astuce!
  • Pour moi le seul moyen fiable est d'ajuster les contraintes dans viewDidLayoutSubviews(). Réglage de contraintes dans viewWillLayoutSubviews() ne fonctionne pas dans mon cas.

InformationsquelleAutor tybro0103 | 2014-12-15