Mise en page automatique contraintes pour une vue d'un redimensionnement automatique créé en ViewController de loadView
Mon UIViewController
crée son point de vue en remplacement de la méthode loadView:
- (void)loadView {
UIView *view = [[UIView alloc] init];
view.autoresizingMask = UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth;
self.view = view;
}
Maintenant, je voudrais passer à mise en page automatique et, par conséquent, ajouter un
view.translatesAutoresizingMaskIntoConstraints = NO;
à la méthode loadView. Maintenant, je dois spécifier les mêmes contraintes qui ont été générés automatiquement à l'avant. Mon approche a été de remplacer updateViewConstraints avec
- (void)updateViewConstraints {
if (0 == [[self.view constraints] count]) {
NSDictionary* views = @{@"view" : self.view};
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[view]|" options:0 metrics:0 views:views]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[view]|" options:0 metrics:0 views:views]];
}
[super updateViewConstraints];
}
Mais j'obtiens une exception parce que je pense que ce genre de contraintes doit aller avec la super vue:
*** Terminating app due to uncaught exception 'NSGenericException', reason: 'Unable to install constraint on view. Does the constraint reference something from outside the subtree of the view? That's illegal.
Alors, comment faire le bon Contraintes à ressembler à?
Vous devez vous connecter pour publier un commentaire.
Vous devez définir les contraintes sur le superview. L'exception est causée par la référence à la superview en passant "|" dans le format visuel. Si vous mettez à jour votre code comme suit cela fonctionne:
Dans la pratique, vous voudrez probablement à vérifier pour autre chose que 0 contraintes sur le superview, mais cela devrait vous aider.
Vous n'avez pas de fixer les contraintes sur la racine de votre vue comme Matt Neuburg explique le Le chapitre 19 de sa Programmation iOS 6 livre, dans la section Mise en page de Manuel:
Le problème avec CEarwood de l'approche est que c'est un ViewController, et son point de vue n'est pas la sous-vue de tout autre point de vue, afin de l'appelant auto.vue.sous-vue seulement les résultats dans le néant. Rappelez-vous que la documentation d'Apple et les lignes directrices suggèrent fortement qu'un UIViewController occupe plus ou moins de la totalité de l'écran (en plus de la barre de navigation ou la barre d'onglets etc.).
Palimondo la réponse est fondamentalement celui de droite: votre UIViewController doit init son point de vue dans loadView, mais il n'a pas besoin de préciser son cadre ou contraintes, car celles-ci sont automatiquement réglé sur le châssis de fenêtre et les contraintes. C'est exactement ce qui est fait par défaut, si vous ne mettez pas en œuvre loadView vous-même.
Je ne suis pas sûr que vous devez définir les contraintes de la racine de la vue de la fenêtre.
Cela dit, vos contraintes de l'air correct, je pense que l'exception que vous obtenez est parce que c':
utilise le | la notation pour représenter le point de vue de l'superview. Comme le niveau de la racine de la vue, il n'a pas de superview. Quelque chose comme cela peut fonctionner mieux: