2013-07-18 8 views
12

Ho un UIPageViewController con un semplice UIViewController al suo interno.UIPageViewController + Problema di rotazione layout automatico

Se il UIViewController non ha subviews, la sua vista viene ridimensionata correttamente quando ruotata. (Sfondo verde fisso).

portraitlandscape

Se l'UIViewController ha una visualizzazione secondaria con un telaio fisso, la sua vista ridimensiona correttamente quando ruotato. (Sfondo verde con quadrato giallo nell'angolo).

portraitlandscape

Se il l'UIViewController ha una visualizzazione secondaria con i suoi vincoli di layout Impostazione automatica per riempire la sua superview, la sua vista non ridimensiona correttamente quando viene ruotato. (Sfondo giallo pieno con lo sfondo rosso di UIPageViewController visibile). Il codice del layout automatico che uso è:

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

Perché il layout automatico di una visualizzazione secondaria influire sulla sua superview? Questo succede solo se è contenuto in un UIPageViewController.

risposta

0

ho capito:

avevo chiamato [[_pageViewController view] setTranslatesAutoresizingMaskIntoConstraints:NO]; nella classe controller del contenitore e non impostare in modo esplicito i vincoli di layout automatico sul suo punto di vista (o viste, come annoiato Astronaut menzionato).

+2

Hey Senior - Sto avendo lo stesso identico problema descritto nella tua domanda. Sareste in grado di fornire un piccolo codice di esempio con questa risposta? Sto facendo tutto con il layout automatico tramite Visual Format Language (proprio come te), e quando ruoto, il mio UIPageViewController fa esattamente ciò che ha fatto il tuo. Hai detto "e non hai impostato esplicitamente i vincoli di layout automatico sulla sua vista" - se potessi fornire il codice per quello, mi sarebbe di grande aiuto e forniresti una risposta più completa. Grazie! – DiscDev

7

La vista del controller di visualizzazione di pagina non è la superview delle viste che rappresentano le pagine. La vista del controller della visualizzazione di pagina ha una gerarchia di viste costituita da una sottoclasse di scroll view personalizzata e la vista di scorrimento a sua volta ha tre sottoclassi di viste generiche, una per le viste dei controller di vista contenuti negli indici da 0 a 2. Questi servono come supervisioni per le tue opinioni contenute. Dovresti indirizzare i tuoi vincoli di layout automatico a quelle viste. Ma è molto più facile usare le maschere di autoresizing e lasciarli convertire in vincoli di layout automatico.

+0

L'utilizzo di maschere autoresizing risolve il problema, grazie. Non sono ancora sicuro del perché la vista contenuta di UIViewController sarebbe stata influenzata dai vincoli di layout automatico della vista secondaria. – Senior

10

Ho avuto anche questo problema e le risposte precedenti non sembravano aiutare molto. Avevo bisogno di aggiungere dei vincoli alla scrollview usata con 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

Bello, sono riuscito a risolvere i problemi di AutoLayout con UIPageViewController all'interno di un container con questa risposta. – Paludis

+0

Grazie! Sei il mio maestro :) – Unmerciful

0

@ La risposta astronauta ha quasi funzionato per me. L'unica cosa che ho fatto oltre a lasciare le maschere di autoresizing per convertire in vincoli di layout automatico è di impostare il frame di vista di UIPageViewController, prima di aggiungerlo alla visualizzazione padre.

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

senza impostare il telaio, i controller di vista bambino sarà visualizzato e posizionato correttamente in qualsiasi orientamento, ma le loro subviews non saranno adeguatamente layouted.