web-dev-qa-db-fra.com

Quand est-ce que updateViewConstraints sera appelé sur mon contrôleur de vue par le framework?

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?

19
topwik

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).

16
lxt

Vous êtes dans ViewController et vous souhaitez que le système appelle updateViewConstraints. Vous devez ensuite appeler ceci.

[self.view setNeedsUpdateConstraints];
14
onmyway133

Votre UIView doit implémenter + (BOOL)requiresConstraintBasedLayout et renvoyer YES. Dans ce cas, updateViewConstraints sera initialement appelé pour configurer les contraintes.

12
highmaintenance

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.

5
Klaas

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 )

0
Doug

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
0
DawnSong