Dans mes applications, je travaille beaucoup avec des contraintes, dans la plupart des cas également avec des animations. Dans certaines circonstances, j'ai besoin de supprimer les contraintes et d'en ajouter de nouvelles.
Comme je dois également prendre en charge iOS 7, je ne peux pas utiliser la propriété active
, qui serait la solution pour moi.
La manière de supprimer les contraintes consiste à utiliser la méthode removeConstraint
sur une UIView
.
Est-il possible de créer une méthode comme
constraint.remove()
vous n'avez donc pas besoin de savoir quelle vue prend en compte la contrainte?
J'ai fini par utiliser la méthode autoRemove
fournie par la bibliothèque PureLayout
: https://github.com/smileyborg/PureLayout
Cette méthode trouve le commonSuperview à l'aide de firstItem ou secondItem et supprime la contrainte de la vue correcte.
Il en a résulté cette ligne:
containerTopConstraint.autoRemove()
Ce que je fais est de créer des tableaux de contraintes que je souhaite pouvoir ajouter/supprimer et d’utiliser simplement les éléments suivants:
@property NSMutableArray *newConstraints;
Remplissez la newConstraints
iOS7 et iOS8:
[self.viewToChange addConstraints:self.newConstraints];
[self.viewToChange removeConstraints:self.newConstraints];
ou iOS8 uniquement, utilisez le nouveau mécanisme
[NSLayoutConstraint activateConstraints:self.newConstraints];
[NSLayoutConstraint deactivateConstraints:self.newConstraints];
Avec cela, vous pouvez appliquer un jeu, supprimer le jeu et en appliquer un nouveau.
Vous pouvez également créer la liste initiale à partir du jeu de storyboard si vous pouvez identifier les contraintes.
Non, pas que je sache. La gestion automatique de la vue de l'hôte est uniquement entrée dans iOS8.
Une implémentation laide pourrait passer en revue toutes les contraintes de toutes les vues pour trouver celle où elle se trouve.
Mais normalement, il ne devrait pas être trop difficile de gérer les contraintes de manière à ce que vous sachiez toujours sur quelle vue elles sont définies.