Supprimer toutes les contraintes affectant une UIView

J'ai une UIView qui est placé sur l'écran par le biais de plusieurs contraintes. Certaines contraintes sont la propriété de la superview, d'autres sont détenues par d'autres ancêtres (par exemple peut-être le point de vue de la propriété d'un UIViewController).

Je veux enlever tous ces vieux contraintes, et de le placer quelque part de nouveau à l'aide de nouvelles contraintes.

Comment puis-je le faire sans la création d'un IBOutlet pour chaque contrainte et d'avoir à se souvenir de la vue qui est propriétaire de ladite contrainte?

À élaborer, l'approche naïve serait de créer un groupe de IBOutlets pour chacune des contraintes, et serait alors impliquer le code appelant, tels que:

[viewA removeConstraint:self.myViewsLeftConstraint];
[viewB removeConstraint:self.myViewsTopConstraint];
[viewB removeConstraint:self.myViewsBottomConstraint];
[self.view removeConstraint:self.myViewsRightConstraint];

Le problème avec ce code, c'est que même dans le cas le plus simple, j'aurais besoin de créer 2 IBOutlets. Pour des mises en page complexes, ce qui pourrait facilement atteindre 4 ou 8 IBOutlets. En outre, j'aurais besoin de m'assurer que mon appel pour supprimer la contrainte est appelée sur le bon point de vue. Par exemple, imaginez que myViewsLeftConstraint est détenue par viewA. Si je ont été accidentellement appel [self.view removeConstraint:self.myViewsLeftConstraint], rien ne se passe.

Remarque: La méthode constraintsAffectingLayoutForAxis semble prometteur, mais est destiné à des fins de débogage seulement.


Mise à jour: Beaucoup des réponses que je reçois de traiter avec self.constraints, self.superview.constraints, ou des variantes de ceux-ci. Ces solutions ne fonctionnent pas car ces méthodes ne renvoyer que les contraintes appartenant par la vue, pas ceux affectant la vue.

De clarifier le problème avec ces solutions, envisager de ce point de vue de la hiérarchie:

  • Grand-père
    • Père
      • Moi
        • Fils
        • Fille
      • Frère
    • Oncle

Maintenant, imaginez que nous créons les contraintes suivantes, et toujours les attacher à leur plus proche ancêtre commun:

  • C0: Moi: même en tant que Fils (détenue par Moi)
  • C1: Moi: largeur = 100 (détenue par Moi)
  • C2: Moi: même hauteur que le Frère (détenue par le Père)
  • C3: Moi: même haut que l'Oncle (détenue par le grand-Père)
  • C4: Moi: même en tant que grand-Père (détenue par le grand-Père)
  • C5: Frère: même en tant que Père (détenue par le Père)
  • C6: Oncle: même en tant que grand-Père (détenue par le grand-Père)
  • C7: Fils: même en tant que Fille (détenue par Moi)

Maintenant, imaginez que nous voulons supprimer toutes les contraintes affectant Me. Une solution devrait supprimer [C0,C1,C2,C3,C4] et rien d'autre.

Si j'utilise self.constraints (où l'auto est Moi), je vais obtenir [C0,C1,C7], puisque ce sont les seules contraintes détenue par Moi. Évidemment, il ne serait pas suffisant pour supprimer ce depuis qu'il est manquant [C2,C3,C4]. En outre, c'est enlever C7 inutilement.

Si j'utilise self.superview.constraints (où l'auto est Moi), je vais obtenir [C2,C5], puisque ce sont les contraintes de la propriété par le Père. Évidemment, on ne peut pas supprimer tous ces depuis C5 est complètement étranger à Me.

Si j'utilise grandfather.constraints, je vais obtenir [C3,C4,C6]. Encore une fois, nous ne pouvons pas supprimer tous ces depuis C6 doit rester intacte.

L'approche par force brute est de faire une boucle sur chacune de la vue des ancêtres (y compris lui-même), et de voir si firstItem ou secondItem sont la vue elle-même; si oui, supprimer cette contrainte. Cela mènera à une solution correcte, le retour [C0,C1,C2,C3,C4], et uniquement à ces contraintes.

Cependant, j'espère qu'il y a une solution plus élégante que d'avoir à boucle à travers l'ensemble de la liste des ancêtres.

  • Que diriez-vous de mettre un identifiant à toutes les contraintes que vous souhaitez supprimer ? De cette façon, vous n'avez pas besoin de conserver un débouché pour eux.
InformationsquelleAutor Senseful | 2014-06-25