2013-07-18 5 views
12

Ich habe einen UIPageViewController mit einem einfachen UIViewController in ihm.UIPageViewController + Auto Layout Rotation Problem

Wenn der UIViewController keine Unteransichten hat, wird die Größe der Ansicht bei Drehung korrekt angepasst. (Fester grüner Hintergrund).

portraitlandscape

Wenn das der UIViewController eine subview mit einem festen Rahmen hat, ändert die Größe seiner korrekten Darstellung wenn sie gedreht wird. (Fester grüner Hintergrund mit gelbem Quadrat in der Ecke).

portraitlandscape

Wenn das der UIViewController eine subview mit seinem automatischen Layoutbeschränkungen eingestellt hat seine Super zu füllen, wird die Größe ihrer Ansicht nicht mehr richtig, wenn sie gedreht. (Durchgehender gelber Hintergrund mit dem roten Hintergrund des UIPageViewControllers sichtbar). Die Auto-Layout-Code ich benutze, ist:

UIView *v = [[UIView alloc] init]; 
[v setTranslatesAutoresizingMaskIntoConstraints:NO]; 
[v setBackgroundColor:[UIColor yellowColor]]; 
[[self view] addSubview:v]; 

NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(v); 

NSArray *cs = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[v]|" options:0 metrics:nil views:viewsDictionary]; 
[[self view] addConstraints:cs]; 

cs = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[v]|" options:0 metrics:nil views:viewsDictionary]; 
[[self view] addConstraints:cs]; 

portraitlandscape

Warum sollte das Auto Layout eines subview seine Superview beeinflussen? Dies geschieht nur, wenn es in einem UIPageViewController enthalten ist.

Antwort

0

ich es herausgefunden:

I [[_pageViewController view] setTranslatesAutoresizingMaskIntoConstraints:NO]; im Container Controller-Klasse und nicht explizit festgelegt, die automatischen Layoutbeschränkungen auf seiner Ansicht (oder Ansichten, wie Bored Astronaut erwähnt) genannt hatte.

+2

Hey Senior - Ich habe genau das gleiche Problem in Ihrer Frage beschrieben. Könnten Sie mit dieser Antwort einen kleinen Beispielcode bereitstellen? Ich mache alles mit Auto-Layout über die Visual Format Language (genau wie du), und wenn ich rotiere, macht meine UIPageViewController genau das, was Sie getan haben. Sie sagten "und setzen die Beschränkungen für das automatische Layout nicht explizit auf seine Ansicht" - wenn Sie den Code dafür bereitstellen könnten, würde es mir immens helfen und eine vollständigere Antwort liefern. Vielen Dank! – DiscDev

7

Die Ansicht des Seitenaufruf-Controllers ist nicht die Superansicht der Ansichten, die die Seiten darstellen. Die View-Controller-Ansicht hat eine View-Hierarchie, die aus einer benutzerdefinierten Scroll-View-Unterklasse besteht, und diese Scroll-View wiederum hat drei generische View-Subclasses, jeweils eine für die Views der enthaltenen View-Controller der Indizes 0 bis 2. Diese dienen als Superviews für Ihre enthaltenen Ansichten. Sie müssten Ihre automatischen Layoutbeschränkungen auf diese Ansichten ausrichten. Es ist jedoch viel einfacher, die Autorisierungsmasken zu verwenden und sie in automatische Layoutbeschränkungen konvertieren zu lassen.

+0

Die Verwendung von Autoresierungsmasken behebt das Problem, danke. Ich bin mir immer noch nicht sicher, warum die Ansicht des enthaltenen UIViewControllers von den automatischen Layouteinschränkungen der untergeordneten Ansicht beeinflusst wird. – Senior

10

Ich hatte dieses Problem auch und die vorherigen Antworten schienen nicht viel zu helfen. Ich musste der mit dem PageViewController verwendeten Scrollview Constraints hinzufügen.

// Add Paging View Controller 
self.addChildViewController(self.pageViewController) 
self.pageViewController.didMoveToParentViewController(self) 
self.containerView.addSubview(self.pageViewController.view) 

// Add Constraints 
var verticalConstraints:Array = NSLayoutConstraint.constraintsWithVisualFormat("V:|[View]|", options: nil, metrics: nil, views: ["View":self.pageViewController.view]) 
var horizontalConstraints:Array = NSLayoutConstraint.constraintsWithVisualFormat("|[View]|", options: nil, metrics: nil, views: ["View":self.pageViewController.view]) 

self.pageViewController.view.setTranslatesAutoresizingMaskIntoConstraints(false) 
self.containerView.addConstraints(verticalConstraints) 
self.containerView.addConstraints(horizontalConstraints) 

// Add Constraints for the Scrollview 
//This line is a bit of a hack. If Apple ever changes the structure of the UIPageViewController, this could break. 
let scrollView = self.pageViewController.view.subviews.first! as UIView 
scrollView.setTranslatesAutoresizingMaskIntoConstraints(false) 
verticalConstraints = NSLayoutConstraint.constraintsWithVisualFormat("V:|[View]|", options: nil, metrics: nil, views: ["View":scrollView]) 
horizontalConstraints = NSLayoutConstraint.constraintsWithVisualFormat("|[View]|", options: nil, metrics: nil, views: ["View":scrollView]) 
self.pageViewController.view.addConstraints(verticalConstraints) 
self.pageViewController.view.addConstraints(horizontalConstraints) 
+0

Schöne, ich war in der Lage, meine AutoLayout Probleme mit UIPageViewController in einem Container mit dieser Antwort zu beheben. – Paludis

+0

Vielen Dank! Du bist mein Meister :) – Unmerciful

0

@Bored Astronaut Antwort fast für mich gearbeitet. Das einzige, was ich getan habe, um Autoresizing-Masken zu belassen, die in Auto-Layout-Constraints konvertiert werden, ist, den View-Frame UIPageViewController zu setzen, bevor er zur übergeordneten Ansicht hinzugefügt wird.

[self addChildViewController:pageViewController]; 
pageViewController.view.frame = self.view.frame; 
[self.view addSubview:pageViewController.view]; 
[pageViewController didMoveToParentViewController:self]; 

Ohne den Rahmen einstellen, wird das Kind Ansicht-Controller in jeder Ausrichtung korrekt angezeigt und positioniert werden, aber ihre Subviews layoutet werden, nicht richtig.