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] |
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
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.
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.
Xcode 5 beta, iOS 7SDK, cible iOS6.1 Peut-être que quelque chose ne va pas avec l'environnement SDK?
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.
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]
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;
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
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]];
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.