web-dev-qa-db-fra.com

Manière correcte de supprimer un NSLayoutConstraint

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?

15
Antoine

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()
6
Antoine

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.

15
Rory McKinnel

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.

0
dasdom