Où dois-je être la mise en forme automatique des contraintes lors de la création de vues par programmation
Je voir différents exemples de cas où les contraintes sont définies. Certains ont mis dans les viewDidLoad
/loadView
(après la sous-vue a été ajouté). Autres les ont mis dans la méthode updateViewConstraints
, qui est appelée par viewDidAppear
.
Quand j'ai essayer de définir des contraintes dans updateViewContraints
il peut y avoir une nervosité à la mise en page, par exemple, léger délai avant l'affichage apparaît. Aussi, si j'utilise cette méthode, dois-je effacer les contraintes existantes premier c'est à dire [self.view [removeConstraints:self.view.constraints]
?
- J'ai eu la même expérience avec updateViewConstraints, alors j'ai arrêté d'essayer de l'utiliser. J'ai configurer les contraintes dans le viewDidLoad, ou dans un affichage personnalisé de updateConstraints méthode. Heureusement, quelqu'un va vous donner une réponse définitive.
updateViewConstraints
: Vous pouvez remplacer cette méthode dans une sous-classe dans le but d'ajouter des contraintes à la vue ou de ses sous-vues. (à partir de la Apple docs)
Vous devez vous connecter pour publier un commentaire.
J'ai configuré mes contraintes dans
viewDidLoad
/loadView
(je suis ciblage iOS >= 6).updateViewConstraints
est utile pour modifier les valeurs de contraintes, par exemple si certaines de contrainte dépend de l'orientation de l'écran (je sais, c'est une mauvaise pratique), vous pouvez modifier saconstant
dans cette méthode.Ajout de contraintes dans
viewDidLoad
est montré au cours de la session "Introduction à la Mise en page Automatique pour iOS et OS X" (WWDC 2012), à partir de 39:22. Je pense que c'est une de ces choses que l'on dit, lors de conférences, mais n'atterrissent pas dans la documentation.Mise à JOUR: j'ai remarqué la mention de la mise en place de contraintes dans La Gestion des ressources en Vue de Contrôleurs:
Mise à JOUR 2: Lors de la WWDC 2015 Apple a donné une nouvelle explication de
updateConstraints
etupdateViewConstraints
usage recommandé:@"|-[button1]-[button2]-|"
dans le ViewController, droit? Ou est-il une manière différente?updateViewConstraints
?-updateConstraints
ou-updateViewConstraints
que cette réponse le recommande. Pourquoi? Mis à part le fait qu'Apple docs dire, ces méthodes sont garantis d'être appelé au bon moment dans le cycle de mise en page. Aussi important: il est très bénéfique de connaître la totalité de votre mise en page de code & les contraintes sont créés et modifiés dans le même lieu, avec un seul point d'entrée. Si vous le faites dans un idempotent de la mode, il est facile de raisonner sur.-updateConstraints
, pas-createConstraints
.loadView
ne fonctionne pas.Je vous recommande de créer un BOOL et de les placer dans le
-updateConstraints
de UIView (ou-updateViewConstraints
, pour UIViewController).-[UIView updateConstraints]
: (apple docs)Les deux
-updateConstraints
et-updateViewConstraints
peut être appelée plusieurs fois au cours d'un point de vue de la durée de vie. (L'appel desetNeedsUpdateConstraints
sur une vue de déclencher cela puisse se produire, par exemple.) Comme un résultat, vous devez vous assurer afin d'empêcher la création et l'activation de dupliquer les contraintes -- soit à l'aide d'un BOOL pour n'effectuer certains contrainte d'installation qu'une seule fois, ou en faisant en sorte de désactiver/supprimer les contraintes existantes avant d'en créer & activation de nouveaux.Par exemple:
Bravo à @fresidue dans les commentaires pour préciser que Apple docs vous recommandons de téléphoner
super
comme la dernière étape. Si vous appelezsuper
avant d'apporter des modifications à certaines contraintes, vous pouvez frapper une exception d'exécution (crash).-updateConstraints
ou quoi que ce soit -- il serait encore appelé et vous avez encore appel[super updateConstraints]
.-updateConstraints
est appelé plusieurs fois, généralement en raison de certains changements à vue, qui provoque UIKit à l'interne et pour définir les "besoins de mise à jour des contraintes" pavillon. Essayez de présenter et indifférent, poussant/popping vue contrôleurs -- vous pouvez voir que déclencher plus d'un appel. J'ai aussi vu mettre un UIButton titre/couleur du titre de la déclencher. Une autre chose que vous pouvez faire est de regarder la UIView.h runtime en-tête à partir de la classe de vidage et de la recherche pour "updateConstraints"...vous allez voir quelques hits comme_needsDoubleUpdateConstraintsPass
.-updateConstraints
ou-updateViewConstraints
directement vous-même, vous ne devriez pas le faire, tout comme vous ne devriez pas appeler-layoutSubviews
vous-même (voir ce chapitre à partir de l'Apple docs sur l'API). Au lieu de cela, vous devriez appeler-setNeedsUpdateConstraints
et laissez UIKit appeler ces méthodes. (Il aboutira plusieurs appels, par exemple.) Si vous avez vraiment besoin de faire une mise à jour synchrone, vous pouvez appeler-updateConstraintsIfNeeded
sur la vue, qui raconte UIKit d'appeler immédiatement-updateConstraints
en supposant qu'il a besoin d'une mise à jour.super
à la fin de votre mise en œuvre de-updateConstraints
ou-updateViewConstraints
. Voir ce commentaire pour plus d'info.Cela devrait être fait dans le ViewDidLoad, comme par WWDC vidéo d'Apple et de la documentation.
Aucune idée de pourquoi on recommande updateConstraints. Si vous n'en updateConstraints vous ayez des problèmes avec NSAutoresizingMaskLayoutConstraint avec auto redimensionnement parce que vos points de vue ont déjà pris en compte automatique des masques. Vous auriez besoin de les enlever en updateConstraints de faire le travail.
UpdateConstraints devrait être pour tout cela, quand vous en avez besoin pour mettre à jour leur, faire des changements, etc à partir de la configuration initiale.
J'ai cette solution pour modifier les contraintes avant ceux qui sont dans la table de montage séquentiel sont chargés.
Cette solution supprime tout accuse après le point de vue est chargé.
Vous pouvez les définir dans viewWillLayoutSubviews: trop:
Le faire en vue a la disposition des sous-vues méthode
Cela a fonctionné pour moi:
Swift 4.2
Même si honnêtement, je ne suis pas sûr si c'est la peine. Il semble un peu plus lent à charger dans le viewDidLoad(). Je voulais juste les déplacer hors de celui-ci, parce que ça devient massive.