2013-07-18 15 views
12

Mam UIPageViewController z prostym UIViewController wewnątrz niego.UIPageViewController + Automatyczne obracanie układu Wydanie

Jeśli UIViewController nie ma subviews, jego widok zmienia się poprawnie po obróceniu. (Stałe zielone tło).

portraitlandscape

Jeśli wykonanie UIViewController ma podrzędny z nieruchomą ramą, jego widok przeskalowanie prawidłowo podczas obracania. (Stałe zielone tło z żółtym kwadratem w rogu).

portraitlandscape

Jeśli The UIViewController ma podrzędny z jego ograniczeniami układu AUTO SET, aby wypełnić swoją Superview, jego widok nie zmienia rozmiar poprawnie po obróceniu. (Stałe żółte tło z widocznym czerwonym tłem UIPageViewController). Kod układ automatycznego używam to:

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

Dlaczego układ auto z podrzędny wpłynąć na jego Superview? Dzieje się tak tylko wtedy, gdy jest zawarta w UIPageViewController.

Odpowiedz

0

I zdobione:

Zadzwoniłem [[_pageViewController view] setTranslatesAutoresizingMaskIntoConstraints:NO]; w klasie kontrolera pojemnik i nie jawnie ustawić ograniczenia układu auto na jego widok (lub widoków, jak Bored Astronaut wymienionych).

+2

Hej, starszy - Mam dokładnie ten sam problem opisany w twoim pytaniu. Czy byłbyś w stanie podać małą próbkę kodu z tą odpowiedzią? Robię wszystko z układem automatycznym za pomocą języka Visual Format (tak jak ty), a kiedy się obracam, mój UIPageViewController robi dokładnie to, co zrobił twój. Powiedziałeś "i nie określiłeś wyraźnie ograniczeń automatycznego układu w swoim widoku" - jeśli mógłbyś podać kod, to pomógłby mi on niezmiernie i dostarczyłby bardziej kompletnej odpowiedzi. Dzięki! – DiscDev

7

Widok kontrolera widoku strony nie jest widokiem widoków reprezentujących strony. Widok kontrolera widoku strony ma hierarchię widoków składającą się z niestandardowej podklasy widoku przewijania, a widok przewijania ma trzy podklasy ogólnego widoku, po jednym dla widoków zawartych kontrolerów widoku w indeksach od 0 do 2. Te służą jako widoki wyskakujące dla twoje zawarte poglądy. Będziesz musiał skierować swoje ograniczenia automatycznego układu do tych widoków. Ale korzystanie z masek automatycznego modelowania jest o wiele łatwiejsze i pozwala je konwertować na ograniczenia układu automatycznego.

+0

Korzystanie z funkcji automatycznego maskowania rozwiązuje problem, dziękuję. Nadal nie jestem pewien, dlaczego na widok zamkniętego UIViewController miałyby wpływ ograniczenia automatycznego układu widoku podrzędnego. – Senior

10

Miałem też ten problem, a poprzednie odpowiedzi nie pomagały. Potrzebowałem dodać ograniczenia do przewijania używanego z PageViewController.

// 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

Dobra, udało mi się naprawić problemy z AutoLayout z UIPageViewController wewnątrz kontenera z tą odpowiedzią. – Paludis

+0

Dziękujemy! Jesteś moim mistrzem :) – Unmerciful

0

@Bored Astronaut odpowiedź prawie pracował dla mnie. Jedyne co zrobiłem oprócz pozostawienia maskowania autorezycyjnego w celu przekonwertowania na ograniczenia układu automatycznego jest ustawienie ramki widoku UIPageViewController przed dodaniem jej do widoku nadrzędnego.

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

bez ustawiania ramkę, kontrolery widoku dziecko będzie wyświetlany i prawidłowo ustawione w dowolnej pozycji, ale ich subviews nie zostaną prawidłowo layouted.

Powiązane problemy