Ich baue ein kompliziertes Projekt, wo ich unter anderem einen UIPageViewController als Kindansicht einer Hauptansicht festlegen muss. Ich verwende Autolayout und verwende Beschränkungen, um die verschiedenen Elemente in der Hauptansicht anzuordnen.Einstellung TranslatesAutoresizingMaskIntoConstraints auf Nein auf UIPageViewController
Das Problem ist, dass, wenn ich versuche, die App zu starten, es aufgrund von widersprüchlichen NSAutoresizingMaskLayoutConstraints abstürzt.
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>"
)
Die übliche Heilung für diese ist TranslatesAutoresizingMaskIntoConstraints auf keine Einstellung.
Allerdings, wenn ich dies tun die Child-Ansichten des UIPageViewController beginnen, die Grenzen des PageViewController zu ignorieren, und am Ende (so weit ich sehe) mit einem Ursprung von (0,0).
Ich habe versucht, die Position zu beheben, indem den Rahmen von Hand einstellen, sowohl wenn die Datenquelle (_itemViewControllers) Einrichtung:
- (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];
}
}
und wenn die Seite
- (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;
}
bekommt aber weder haben irgendein Effekt.
Ich brauche die Einschränkungen für das, was ich tue, also ist das Festhalten an Masken keine Option. Ich denke, was ich suche, ist eine Möglichkeit, die UIPageViewController-Kinder, die hinzugefügt wurden (nach jedem Prozessaufruf viewControllerBeforeViewController
), Einschränkungen hinzuzufügen. Aber ich würde gerne hören, wie dieses Problem gelöst werden kann.
Bearbeiten: Ich habe einen Hack gefunden, um das Problem zu lösen. Ich bin nicht ganz sicher, ob das, was ich hier aufzählen möchte, die gesamte Lösung ist, aber es ist das, was ich gerade jetzt bemerke, nachdem ich mehr als einen Monat lang an dem Code herumgebastelt habe.
Zuerst im View-Controller, der die pageviewcontroller einrichtet, habe ich die folgenden zwei Zeilen, nachdem ich die pageviewcontroller initialisiert haben
UIView *pageView = self.pageViewController.view;
pageView.frame = self.view.frame;
Nicht, dass ich [self.view setTranslatesAutoresizingMaskIntoConstraints:NO];
in diesem View-Controller eingestellt haben.
Zweitens, auf den untergeordneten Controllern überprüfe ich, ob die Ansicht innerhalb oder außerhalb eines Seitenaufrufcontrollers verwendet wird. Nur wenn die Ansicht nicht in einem Seitenaufrufcontroller verwendet wird, ist [self.view setTranslatesAutoresizingMaskIntoConstraints:NO];
in der untergeordneten Ansicht festgelegt.
Nun, das funktioniert (für mich) im Moment. Aber ich hätte gerne eine Lösung, die weniger hacky ist.
Der Absturz ist wahrscheinlich auf etwas anderes zurückzuführen. Bei widersprüchlichen Constraints ignoriert es normalerweise einen von ihnen (und protokolliert den Fakt). Können Sie den gesamten Stack-Trace einfügen? –
Es heißt (ein Beispiel zu geben): „Werden durch Zwang zu brechen zu erholen versuchen Pause auf objc_exception_throw dies im Debugger zu fangen Die Methoden in der UIConstraintBasedLayoutDebugging-Kategorie in UIView, die in aufgelistet sind, können ebenfalls hilfreich sein. " Aber darüber hinaus gibt es keine relevanten Protokollmeldungen. Und es stürzt ab, nachdem er diese Nachricht gegeben hat. –
Rubberduck
Können Sie beschreiben, was Sie _visuell_ erreichen möchten? Das wäre sehr nützlich, um irgendeine Art von Ratschlag zu geben :) –