Que se passe-t-il avec les contraintes lorsqu'une vue est supprimée

109

La question que j'ai est simple mais je n'ai trouvé aucune information dans la documentation.

Que se passe-t-il avec les contraintes de mise en page lorsqu'une vue est supprimée de la hiérarchie des vues (ou déplacée vers une autre vue)?

Par exemple, ayons un conteneur Cavec des sous-vues Aet B. Le conteneur Ccontient certaines contraintes. Ensuite, nous appelons [A removeFromSuperview]. Que se passe-t-il avec les contraintes A?

Que se passe-t-il alors si nous ajoutons Aà Cnouveau?

Sulthan
la source

Réponses:

118

Les contraintes sont supprimées. Si vous ajoutez à nouveau A, vous devrez créer de nouvelles contraintes pour celui-ci, ou si vous enregistrez les contraintes avant de supprimer A, vous pouvez les rajouter. Quand je fais quelque chose comme ça, j'enregistre les contraintes comme celle-ci pour une vue appelée view1:

self.portraitConstraints = [NSMutableArray new];
for (NSLayoutConstraint *con in self.view.constraints) {
    if (con.firstItem == self.view1 || con.secondItem == self.view1) {
       [self.portraitConstraints addObject:con];
    }
}
rdelmar
la source
7
Peut-on trouver ce fait quelque part dans la documentation? Je vous crois mais il semble étrange que le fait ne soit mentionné nulle part.
Sulthan le
2
Il est logique que les contraintes soient supprimées avec la vue. Si ce n'était pas le cas, comment le système de mise en page pourrait-il les évaluer lors d'un prochain passage?
Mike Pollard le
6
Car aussi évidente que cela puisse paraître, cette réponse était toujours extrêmement utile!
race_carr
1
@pnollet, je ne sais pas pourquoi l'affiche de cette question a fait ce qu'il a fait. J'ai consigné ceci pour vérifier, et lorsque je supprime une sous-vue et vérifie les contraintes sur la supervision, les contraintes qui se rapportaient à la sous-vue supprimée ont disparu.
rdelmar
4
@Firo, je suis sûr qu'ils sont censés être supprimés, donc s'ils ne sont pas dans iOS 6, c'est probablement un bogue. BTW, le document de la méthode removeFromSuperview dit: «L'appel de cette méthode supprime toutes les contraintes qui font référence à la vue que vous supprimez, ou qui font référence à n'importe quelle vue dans la sous-arborescence de la vue que vous supprimez».
rdelmar
41

Depuis que j'ai aussi cette question, j'ai vérifié les documents Apple juste pour les coups de pied, et il s'avère qu'il est documenté que les contraintes sont supprimées.

La documentation de la méthode UIView removeFromSuperview indique:

L'appel de cette méthode supprime toutes les contraintes qui font référence à la vue que vous supprimez ou qui font référence à n'importe quelle vue dans la sous-arborescence de la vue que vous supprimez.

Je ne sais pas si cela a été documenté l'année dernière lorsque la question originale a été publiée, mais j'ai juste pensé partager cette information au cas où quelqu'un en aurait besoin ...

Pierre Evan
la source
Super merci d'avoir ajouté ceci directement à partir du doc
Esko918
3

Sachez cependant que si vous avez deux vues parent indépendantes A et B, et une sous-vue C, où C est actuellement une sous-vue de A, avec des contraintes appropriées, cet appel à [B addSubview: C] n'effacera PAS les contraintes relatives à A et C, et la mise en page automatique commencera à lever des exceptions, car ces contraintes ne se rapportent plus aux vues de la même hiérarchie.

Vous devrez appeler [C removeFromSuperview] explicitement pour supprimer les contraintes, avant d'ajouter C à B.

C'est vrai sur Mac OS X - je n'ai pas vérifié iOS

Martin Redington
la source
Intéressant! Où avez-vous obtenu cette information? Les documents pour addSubview ne mentionnent pas ce comportement. Je demande parce que j'ai actuellement une exception sporadique, lors de la suppression d'un contrôleur de vue, qui indique `` Impossible d'installer la contrainte sur la vue '' - ce que je ne fais pas.
JimmyB
2

Les contraintes sont également supprimées lorsque vous [A removeFromSuperview]

Ils sont oubliés et l'ajout de A à C n'ajoute à nouveau aucune contrainte.

Mike Pollard
la source
0

Ils sont également supprimés, vous pouvez faire un simple test. Choisissez une vue SUBVIEW et créez des contraintes de coût qui contraignent SUBVIEW à suivre son redimensionnement de la vue supervisée (comme attaché à pour superviser les bords). Pour ce faire, ajoutez SUBVIEW comme sous-vue à ce CONTAINERVIEW et ajoutez comme contraintes quelque chose comme ça:
V: | - [SUBVIEW] - |
H: | - [SOUS-VUE] - |
Ces contraintes doivent être ajoutées à SUBVIEW superview, donc CONTAINERVIEW.
Si vous supprimez SUBVIEW en vérifiant simplement toutes les contraintes CONTAINERVIEW, vous pouvez voir que deux ne sont plus là.

Andrea
la source
0

Cette question peut également être prouvée par le constructeur d'interface. Lorsque vous faites glisser et déposez un UIViewsur les ViewControllercontraintes d'ajout puis supprimez le UIView, vous pouvez voir les contraintes bleues disparaître.

William Hu
la source
4
Storyboard ne prouve rien sur la façon dont le comportement d'exécution se produira. Storyboard peut faire tout ce qu'il veut!
mxcl