Paramètre TranslatesAutoresizingMaskIntoConstraints sur No sur UIPageViewController
Je suis en train de construire un projet complexe, où, entre autres choses, j'ai besoin de configurer un UIPageViewController comme un childview d'une vue principale. Je suis avec mise en page automatique, et à l'aide de contraintes d'ordre les différents éléments dans la vue principale.
Le problème, c'est que quand j'essaye d'exécuter l'application, il se bloque à cause du conflit entre NSAutoresizingMaskLayoutConstraints.
2013-10-28 16:22:18.419 Red Event App[1658:60b] Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints)
(
"<NSLayoutConstraint:0x145c1990 V:|-(20)-[UINavigationBar:0x145bf6b0] (Names: '|':UIView:0x145bf620 )>",
"<NSLayoutConstraint:0x145bf510 V:[UINavigationBar:0x145bf6b0]-(0)-[UIView:0x145bef70]>",
"<NSLayoutConstraint:0x145d0550 UIView:0x145a8c10.top == UIView:0x145bf620.top>",
"<NSAutoresizingMaskLayoutConstraint:0x145b3a40 h=-&- v=-&- UIView:0x145a8c10.midY == UIView:0x145bef70.midY + 56.5>",
"<NSAutoresizingMaskLayoutConstraint:0x145b3a70 h=-&- v=-&- UIView:0x145a8c10.height == UIView:0x145bef70.height + 113>"
)
L'habitude de remède pour ce paramètre est TranslatesAutoresizingMaskIntoConstraints pas.
Cependant, lorsque je fais ceci, l'enfant vues sur la UIPageViewController commencer à ignorer les limites de la PageViewController, et à la fin (aussi loin que je peux voir) avec un point d'origine (0,0).
J'ai essayé de corriger la position de réglage de la cadres de par la portée de la main lors de la configuration de la source de données (_itemViewControllers):
- (void)setupLeafs{
_itemViewControllers = [[NSMutableArray alloc]init];
for(NSString *pagename in _datasource){
RWNode *page = [_xml getPage:pagename];
UIViewController *viewController = [RWNavigationController getViewControllerFromDictionary:[page getDictionaryFromNode]];
viewController.view.frame = CGRectMake(self.view.frame.origin.x,self.view.frame.origin.y,self.view.frame.size.width, self.view.frame.size.height);
[_itemViewControllers addObject:viewController];
}
}
et lors de l'obtention de la page
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController {
UIViewController *nextViewController = [self getPreviousLeaf:viewController];
nextViewController.view.frame = CGRectMake(self.view.frame.origin.x,self.view.frame.origin.y,self.view.frame.size.width, self.view.frame.size.height);
return nextViewController;
}
mais n'ont aucun effet.
J'ai besoin de contraintes pour ce que je suis en train de faire, afin de coller à des Masques n'est pas une option. Je pense que ce que je cherche est un moyen de mettre des contraintes sur les UIPageViewController enfants après qu'ils ont été ajoutés (par quelque procédé que ce soit les appels viewControllerBeforeViewController
). Mais je voudrais vraiment entendre parler de quelque manière que ce problème peut être résolu.
Edit:
J'ai trouvé un hack pour résoudre le problème. Je ne suis pas tout à fait sûr si ce que je vous liste ici est l'ensemble de la solution, mais c'est ce que je remarque maintenant, après plus d'un mois de bricoler avec le code.
D'abord, du point de vue du contrôleur qui met en place le pageviewcontroller, j'ai les deux lignes suivantes, après je l'ai initialisé le pageviewcontroller
UIView *pageView = self.pageViewController.view;
pageView.frame = self.view.frame;
Pas que j'ai mis [self.view setTranslatesAutoresizingMaskIntoConstraints:NO];
de ce point de vue-contrôleur.
D'autre part, sur l'enfant contrôleurs-je vérifier si la vue est utilisé à l'intérieur ou à l'extérieur d'un pageviewcontroller. Seulement si la vue est pas être utilisé dans un pageviewcontroller est [self.view setTranslatesAutoresizingMaskIntoConstraints:NO];
ensemble sur la vue enfant.
Maintenant, cela fonctionne (pour moi) pour le moment. Mais je voudrais vraiment une solution qui est moins hacky.
source d'informationauteur Rubberduck
Vous devez vous connecter pour publier un commentaire.
Lors de l'utilisation de mise en forme automatique, vous ne devriez jamais directement l'image d'un point de vue. Les contraintes sont utilisées pour le faire pour vous. Normalement, si vous souhaitez définir vos propres contraintes dans une vue, vous remplacez la
updateConstraints
méthode de votre UIViews. Assurez-vous que le contenu de vues pour le contrôleur de la page de permettre à leurs bords peuvent être redimensionnées, car ils seront de taille pour s'adapter à la vue de la page de l'image. Vos contraintes et à la vue de l'installation devra en tenir compte, ou vous vous obtiendrez unsatisfiable contrainte erreurs.Alors que je ne sais pas exactement ce que vous essayez d'atteindre visuellement, voici deux conseils qui pourraient vous aider:
Tout d'abord, n'oubliez pas de supprimer toutes les contraintes existantes à partir d'un
UIView
avant d'en ajouter de nouvelles dans le code. Ne pas mélanger des contraintes d'Interface Builder avec des contraintes dans le code, il va vous conduire fou. Exemple:Deuxièmement, vous pouvez avoir
NSLayoutConstraint
points de vente, comme tous les autres points de vente à partir d'un XIB ou d'un scénario. De cette façon, vous pouvez modifier certaines propriétés d'une contrainte à l'exécution:J'espère que cela vous aide un peu 🙂
Je ne peux pas vous donner la réponse, mais peut-être que je peux vous donner quelques débogage des conseils.. copier les informations du journal dans un éditeur de texte et remplacez l'adresse en mémoire de l'information de l'opinion avec des noms significatifs. (utiliser le débogueur pour trouver les propriétés les adresses de la mémoire de la carte si vous ne pouvez pas le comprendre). Ensuite, vous trouverez qu'il est un peu plus facile de comprendre les informations des journaux et des traces du conflit. Voici un exemple (même si je suis juste deviner votre point de vue de la hiérarchie)
À deviner, les deux derniers autoresizingmasklayoutconstraints paraître étrange pour moi, ils ne regardent pas clairement définis.
J'ai juste couru dans une situation similaire. Si j'ai mis toutes les contraintes de la UIPageViewController de vue, il serait à l'origine de conflits avec les d'un redimensionnement automatique de masque de contraintes.
Ce qui fonctionne pour moi est de mettre en translatesAutoresizingMaskIntoConstraints PAS pour UIPageController vue, puis ajouter des contraintes à la vue parent pour la pageController de la vue d'en haut, à gauche, la largeur et la hauteur.