J'ai un contrôleur de vue et je veux créer et définir mes contraintes de vue dans updateViewConstraints. J'ai un point de rupture dans cette méthode et on ne l'appelle jamais.
Pourquoi ne pourrait-il pas se faire appeler? Quand le framework voudra-t-il appeler cette méthode sur mon contrôleur de vue?
updateViewConstraints
est appelé par viewWillLayoutSubviews
(via la méthode layoutSubviews
de votre vue en cours de route). Comme son nom l'indique, cette procédure est appelée chaque fois que votre contrôleur de vue doit mettre à jour sa présentation.
Si vous trouvez que updateViewConstraints
est jamais appelé, vous devez vous assurer que vous appelez super
les méthodes de votre contrôleur de vue, le cas échéant.
En outre, il semble que vous créez vos contraintes dans updateViewConstraints
? Cela peut aussi être la cause de votre problème. Vous devriez mettre à jour vos contraintes dans cette méthode, pas les créer (de la même manière que dans layoutSubviews
, vous positionnez vos vues, mais ne les instanciez pas).
Vous êtes dans ViewController et vous souhaitez que le système appelle updateViewConstraints
. Vous devez ensuite appeler ceci.
[self.view setNeedsUpdateConstraints];
Votre UIView
doit implémenter + (BOOL)requiresConstraintBasedLayout
et renvoyer YES
. Dans ce cas, updateViewConstraints
sera initialement appelé pour configurer les contraintes.
Juste une supposition et pas à 100% certain:
updateViewConstraints ne sera pas appelé si la vue racine de vos contrôleurs de vue ne nécessite pas de présentation automatique. Donc, vous devez au moins ajouter une contrainte à votre vue racine (quelque part dans loadview ou viewDidLoad) ou définir
self.view.translatesAutoresizingMaskIntoConstraints = NO;
Cela devrait déclencher votre point de rupture.
Vous devriez appeler setNeedsUpdateConstraints
comme le dit la documentation Apple:
Pour planifier une modification, appelez setNeedsUpdateConstraints dans la vue. Le système appelle ensuite votre implémentation de updateViewConstraints avant la présentation. ( Référence Apple )
Vous pouvez ajouter des contraintes dans updateViewConstraints
si vous ajoutez un indicateur pour indiquer si des contraintes ont été ajoutées. Voir aussi my Gist
@implementation ViewController {
bool _constraintsAdded;
}
- (void)updateViewConstraints {
if (!_constraintsAdded) {
_constraintsAdded = true;
// TODO: add constraints to self.view's subviews
}
NSLog(@"update constraint.");
// TODO: update constraints needed
[super updateViewConstraints]; // must be called finally.
}
@end