web-dev-qa-db-fra.com

Qu'advient-il des contraintes lorsqu'une vue est supprimée

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

Qu'advient-il des contraintes de présentation lorsqu'une vue est supprimée de la hiérarchie des vues (ou déplacée vers une autre vue)?

Par exemple, utilisons le conteneur C avec les sous-vues A et B. Le conteneur C contient certaines contraintes. Ensuite, nous appelons [A removeFromSuperview]. Qu'advient-il des contraintes pour A?

Que se passe-t-il ensuite si nous ajoutons à nouveau A à C?

94
Sulthan

Les contraintes sont supprimées. Si vous ajoutez à nouveau A, vous devrez lui créer de nouvelles contraintes 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 ceci 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];
    }
}
105
rdelmar

Comme j'avais aussi cette question, j'ai vérifié les documents Apple Docs, et il s'est avéré 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 faisant référence à la vue que vous avez sont en train de supprimer ou font référence à une vue de la sous-arborescence de la vue que vous avez enlèvent.

Je ne sais pas si cela a été documenté l'année dernière lorsque la question initiale a été posée, mais je pensais simplement que je partagerais cette information au cas où quelqu'un en aurait besoin ... 

37
Evan K. Stone

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, l'appel de [B addSubview: C] n'effacera PAS les contraintes relatives à A et C, et la présentation automatique commence à générer des exceptions, car ces contraintes ne concernent plus les vues de la même hiérarchie.

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

Ceci est vrai sur Mac OS X - Je n'ai pas vérifié iOS

3
Martin Redington

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

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

2
Mike Pollard

Ils sont supprimés aussi, vous pouvez faire un test simple. Choisissez une vue SUBVIEW et créez des contraintes de coût qui contraignent SUBVIEW à suivre le redimensionnement de sa vue supérieure (comme sur les bords de la vue supérieure). Pour ce faire, vous ajoutez SUBVIEW en tant que sous-vue à ce CONTAINERVIEW et ajoutez comme contraintes quelque chose comme ça:
V: | - [SUBVIEW] - |
H: | - [SUBVIEW] - |
Ces contraintes doivent être ajoutées à SUBVIEW superview, donc à CONTAINERVIEW. 
Si vous supprimez SUBVIEW en cochant simplement toutes les contraintes de CONTAINERVIEW, vous constaterez que deux ne sont plus disponibles.

1
Andrea

Cette question peut également être prouvée par le constructeur d'interface. Lorsque vous faites glisser une UIView sur la ViewController ajouter des contraintes puis supprimez la UIView, vous pouvez voir les contraintes bleues disparaître.

0
William Hu