Mise en page automatique des contraintes et de l'enfant-vue-contrôleur
J'ai deux contrôleurs de vue, le parent et l'enfant.
Donc dans le viewDidLoad
méthode je ne les suivants:
ChildViewController* childViewController = [[ChildViewController alloc] init];
[self addChildViewController:childViewController];
//ChildViewController sets his own constraints in viewDidLoad
[self.view addSubview:childViewController.view];
[childViewController didMoveToParentViewController:self];
//
//setup constraints to expand childViewController.view to
//fill the size of parent view controller
//
Donc, fondamentalement, ce qui se passe est que updateViewConstraints
est appelée sur ChildViewController avant de contrôleur de parent de contraintes, donc en fait self.view.frame == CGRectZero
, exactement le même que j'ai spécifié dans la coutume loadView
méthode dans ChildViewController
.
translatesAutoresizingMaskIntoConstraints
tous ensemble pour NO
pour tous les points de vue.
Quelle est la bonne manière pour l'installation de contraintes dans ce cas, afin de ChildViewController
les mises à jour de ses contraintes après parent?
Journal actuel de deux contrôleurs est assez frustrant, je ne comprends pas comment updateViewConstraints peut être appelée avant viewWillLayoutSubviews:
App[47933:c07] ChildViewController::updateViewConstraints. RECT: {{0, 0}, {0, 0}}
App[47933:c07] ParentViewController::updateViewConstraints
App[47933:c07] ChildViewController:viewWillLayoutSubviews. RECT: {{0, 0}, {984, 454}}
App[47933:c07] ChildViewController:viewDidLayoutSubviews. RECT: {{0, 0}, {984, 454}}
J'ai résolu le problème et posté la réponse ci-dessous, pas sûr que c'est la solution que je cherchais, il semble erroné, mais il fonctionne. Désolé de ne pas poster le code, c'est trop de code...
OriginalL'auteur highmaintenance | 2013-07-29
Vous devez vous connecter pour publier un commentaire.
J'ai une situation similaire où j'ai ajouter un contrôleur enfant visible contrôleur (une fenêtre).
J'ai une définition de l'enfant-vue-contrôleur dans interface builder. C'est la méthode viewDidLoad appelle juste setTranslatesAutoresizingMaskIntoconstraints:PAS de
Puis-je définir cette méthode sur le contrôleur enfant qui prend un UIViewController paramètre, qui est le parent.
Cette méthode permet d'ajouter lui-même à la vue parent contrôleur et définit ses propres contraintes:
puis à l'intérieur de la mère UIViewController (celui qui est déjà à l'écran), lorsque je veux afficher mon enfant popup-vue-contrôleur elle appelle:
Vous pouvez définir quelles que soient les contraintes que vous voulez sur l'enfant du contrôleur de la vue lors de l'ajout à la mère du contrôleur de vue.
OriginalL'auteur Jonathon Horsman
Je pense que le
layoutIfNeeded
méthode ne fonctionnera que si vous avez déjà appelésetNeedsLayout
. Si vous utilisezsetNeedsLayout
au lieu de cela, le système sera de mettre à jour à un moment approprié. Essayez de modifier que dans votre code.Lorsque vous ajoutez des contraintes de vue, de ce point de vue devrait automatiquement la mise en page de ses sous-vues de nouveau pour tenir compte des nouvelles contraintes. Il devrait y avoir aucun besoin d'appeler
setNeedsLayout
à moins que quelque chose a changé depuis que vous avez ajouté les contraintes. Êtes-vous en ajoutant les contraintes d'un point de vue et, dans l'affirmative, êtes-vous de les ajouter à la vue de droite?Une chose que vous pouvez essayer est de la sous-classe
UIView
de sorte que vous voyez un message de log à chaque fois que leChildViewController.view
ouParentViewController.view
effectue une nouvelle mise en page:Peut-être qui va révéler quelque chose au sujet de quand vos points de vue sont (ou ne sont pas) mise en page de leurs sous-vues.
Si l'Enfant contrôleur de mise à jour en premier, puis les parents. Toutes les contraintes créées dans le viewDidLoad, donc je n'ai pas de comprendre exactement comment c'est possible.
OriginalL'auteur Maarten
Vous pouvez ajouter des contraintes à droite après invoquer de addSubview: , n'oubliez pas de mettre
translatesAutoresizingMaskIntoConstraints
àfalse
Voici un extrait de code de l'ajout et de cacher l'enfant-vue-contrôleur avec contraintes (inspiré par apple guide)
Affichage
Cacher
OriginalL'auteur Benny Davidovitz
Selon le lien suivant, j'ai déplacé les contraintes de la création à la
viewWillLayoutSubviews
, c'est l'endroit où afficher les limites sont fixées correctement. Je sens que cette réponse manque d'explication sur le pourquoi de l'Enfant-vue-contrôleur de updateViewConstraints appelé avant de parent-vue-contrôleur, ou peut-être que c'est juste un bug dans mon code, mais cette solution résout le problème...OriginalL'auteur highmaintenance