web-dev-qa-db-fra.com

Mise en page automatique non valide après présentation du contrôleur de vue (et de nombreuses situations)

Contexte:

J'ai un contrôleur de conteneur personnalisé, qui ressemble à UITabBarController, mais avec une animation de commutateur. Et j'utilise la mise en page automatique pour atteindre.
Étant donné que la commutation entre les contrôleurs enfants est dynamique, les contraintes appropriées sont ajoutées au contrôleur de vue enfant lorsque sa vue est ajoutée à la vue du conteneur, et non prédéfinie dans IB. (Les contraintes sont ajoutées à la vue d'ensemble bien sûr)

http://d.pr/i/q6NF Configuration de la nib de contrôleur de conteneur

PS: Le détail des contraintes
H: | [Child] (Modifie la constante de la contrainte en animation de gauche/droite à droite/gauche)
H: [Enfant (== Super)]
V: | [Enfant] | 

Où est le problème:

Un des contrôleurs enfants est un contrôleur de navigation, les choses tournent mal lorsque le contrôleur de navigation présente un contrôleur de vue modale (à l'aide de presentViewController:animated:completion:) et le rejette (à l'aide de dismissViewControllerAnimated:completion:). , 0), Il semble que la mise en page automatique ne soit plus valide, peut-être que les contraintes ont été supprimées.

http://d.pr/i/VmvL The Present/Processus de rejet

Recherche

Je n'ai pas encore utilisé de code pour vérifier ce qu'il advient de ces contraintes, mais avec Spark Inspector, la présentation des vues a été modifiée au cours du processus de présentation/suppression. Lorsque Mon contrôleur de navigation présente un contrôleur de vue modale, iOS ne fait que permuter la vue complète du contrôleur de navigation sur la vue du contrôleur de vue modale. Et lorsque la vue du contrôleur de navigation revient, la mise en page automatique ne fonctionne plus.

Solution possible

Une des solutions que j'ai proposée est de laisser mon contrôleur de conteneur présenter un contrôleur modal.

Ou je modifie simplement mon contrôleur de conteneur en aucune mise en page automatique.

En fait, depuis que je commence à utiliser la mise en page automatique, les problèmes causés par cette technique ne font que dominer les avantages. Outre ce problème, chaque fois que l'orientation de l'interface change, les vues à l'intérieur de mon contrôleur de conteneur ne peuvent tout simplement pas être correctement mises en page, il semble que les sous-vues utilisent toujours le cadre de superview avant le changement d'orientation. Je revérifie les contraintes que je configure, il n'y a pas de conflits et pas d'ambiguïté.

Mon hypothèse est que mon contrôleur de conteneur personnalisé n'est pas compatible avec la présentation du contrôleur de vue modal et le changement d'orientation de l'interface dans le système de présentation automatique, même avec la configuration de contraintes.

Environnement Xcode

Xcode 5 beta, iOS 7SDK, cible iOS6.1 Peut-être que quelque chose ne va pas avec l'environnement SDK?

29
Michael Hui

J'ai eu un problème similaire . Je mettais translatesAutoresizingMaskIntoConstraints = NO; sur ma racine UIView . Il apparaît que le "plus externe" UIView - la superview à la racine de votre hiérarchie doit utiliser le translatesAutoresizingMaskIntoConstraints = YES..__ par défaut. Tout a fonctionné comme prévu.

32
Palimondo

Cela est probablement dû à des contraintes ambiguës. Je recommande de suspendre une application en cours d'exécution et de saisir la commande suivante dans la console:

po [[UIWindow keyWindow] _autolayoutTrace] 
12
Tomáš Linhart

Si vous utilisez la disposition automatique entre la variable UIWindow et votre vue racine (pour que la vue racine remplisse la totalité de la variable UIWindow), ces contraintes seront balayées par la présentation en plein écran d'un autre contrôleur de vue. 

Qu'est-ce qui se passe, toute la hiérarchie de la présentation en plein écran remplace tout ce qui se trouve sous UIWindow - votre vue d'origine est supprimée (suppression des contraintes) et la nouvelle hiérarchie de vue remplacée. Ensuite, lorsque votre avis est remplacé, ces contraintes sont perdues. Vous devrez les recréer quelque part comme viewWillAppear: ou simplement vous assurer que votre vue racine a self.view.translatesAutoresizingMaskIntoConstraints = NO;

6
Rob Glassey

J'ai également le même problème et lorsque j'ai essayé ce contrôleur de navigation, il fonctionnait bien, mais pas avec le contrôleur de vue actuel. Utilisez la méthode de contrôleur de vue ci-dessous avec translatesAutoresizingMaskIntoConstraints pour résoudre ce problème. 

-(void) viewWillLayoutSubviews
{
    [super viewWillLayoutSubviews];

    self.view.translatesAutoresizingMaskIntoConstraints = NO;
}

S'il vous plaît, laissez-moi maintenant si vous avez des inquiétudes à ce sujet. Merci

4
chandan

J'ai eu le même problème, avec un conteneur de barre de recherche que l'élément mal placé (à l'intérieur d'un UIViewController, à l'intérieur d'un UITabBarController). Aucune des solutions que j'ai rencontrées n'a fonctionné, mais j'ai finalement réussi à contourner le problème en rajoutant la contrainte de présentation dans le viewWillAppear:

[self.view addConstraint:[NSLayoutConstraint constraintWithItem: self.searchBar.superview
                                                      attribute: NSLayoutAttributeTop
                                                      relatedBy: NSLayoutRelationEqual
                                                         toItem: self.view
                                                      attribute: NSLayoutAttributeTop
                                                     multiplier: 1
                                                       constant: 0]];
0
Paul

J'ai eu un problème similaire avec les cellules de vue de tableau que je disposais avec autolayout. Au retour d'une vue modale, les cellules avaient une présentation non valide. Je pouvais remodeler chaque cellule après viewDidAppear, mais cela avait l'air terrible. Grâce à la suggestion de @ palimondo, j'ai commencé à renifler translatesAutoresizingMaskIntoConstraints. Il se trouve que je configurais la vue de contenu de ma cellule de vue tableau sur translatesAutoresizingMaskIntoConstraints = NO alors que je n'aurais pas dû l'être.

0
Phil Viso