13

Ich habe eine View-Controller programmgesteuert eingerichtet, die ein Kind hat UIPageViewController. Dies zeigt verschiedene andere View-Controller an, die ebenfalls programmgesteuert eingerichtet sind. Die Ansichten dieser Ansichts-Controller haben translatesAutoresizingMaskIntoConstraints auf YES, aber die Ansicht des Seitenaufruf-Controllers verwendet Einschränkungen, um sich im TopView-Controller zu positionieren.UIPageViewController nicht die Größe seiner untergeordneten Ansicht Controller

Das Problem ist, wenn der Benutzer das Gerät dreht der Seitenaufruf Controller Größe seinen Rahmen, aber seine Kind-View-Controller nicht. Durch didRotateFromInterfaceOrientation ist sein Rahmen immer noch aus der alten Ausrichtung. Ich habe überprüft, dass die Rotationsmethoden auf den Child-View-Controllern aufgerufen werden, ihr Frame ändert sich einfach nicht.

habe ich die Seite View-Controller wie folgt auf:

self.pageViewController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil]; 
self.pageViewController.view.backgroundColor = [UIColor clearColor]; 
self.pageViewController.view.translatesAutoresizingMaskIntoConstraints = NO; 
self.pageViewController.dataSource = self; 
self.pageViewController.delegate = self; 
[self.pageViewController willMoveToParentViewController:self]; 
[self.view addSubview:self.pageViewController.view]; 
[self addChildViewController:self.pageViewController]; 
[self.pageViewController didMoveToParentViewController:self]; 

self.currentPageIndex = 0; 

self.currentPageController = [self pageForIndex:self.currentPageIndex]; 
self.currentPageController.delegate = self; 
[self.pageViewController setViewControllers:@[self.currentPageController] direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:NULL]; 

Ich habe setNeedsLayout versucht Aufruf, aber es ist eine ungeschickte Drehung Animation und die nächste Seite, die ich zu streichen ist auch nicht richtig angepasst.

Warum ändert der Seitenaufruf-Controller die Größe der untergeordneten Ansichts-Controller nicht und wie bekomme ich dies?

Danke!

+0

Haben Sie eine Lösung für Ihr Problem gefunden? Ich stehe mit demselben Problem fest. – AlexR

+0

Das Problem ist, dass -didRotateFromInterfaceOrientation auf den untergeordneten Controllern nie aufgerufen wird. Ich löste es, indem ich es manuell von der übergeordneten Ansicht Controller-didRotateFromInterfaceOrientation aufrufen. –

+0

Was ist die Methode auf dem Cllld View Controller, die Sie aufrufen, um die Orientierungsänderung zu handhaben? – Satyam

Antwort

-1

Das Hinzufügen der Ansicht eines Controllers direkt in die Ansicht eines anderen Controllers und das Erwarten des Aufrufs der Rotation und der Lebenszyklusmethoden ist nicht die beste Vorgehensweise. Ich glaube, das Hinzufügen zur Steuerungshierarchie könnte funktionieren, aber ich kann nicht viel dazu sagen.

Ich habe mit einem Tab-Bar-Navigator getestet und mein UIPageViewController bekam die Ereignisse zusammen mit dem Controller, der im UIPageViewController angezeigt wurde. Ich vermute, wenn ich den Controller in einen UINavigationController schiebe, bekomme ich das gleiche Ergebnis.

Ich würde Ihnen empfehlen, Ihren UIPageViewController standardmäßiger anzuzeigen, als wenn Sie die Ansicht eines anderen Controllers hinzufügen.

+0

Es ist nicht notwendig, dass Seitenaufruf-Controller immer Vollbild sein muss. Auf einem Gerät wie dem iPad kann es Teil der Ansicht sein. Und so muss es umgesetzt werden, wie in der Frage erwähnt. Korrigiere mich, wenn es einen anderen Weg gibt, es zu erreichen. – Satyam

6

Zuerst richten Sie alles mit automatischem Layout, programmgesteuert oder Storyboard ein. Fangen Sie dann die Orientierungsänderung in dem übergeordneten Ansichtscontroller ein, und zwingen Sie die Ansicht von UIPageViewController zu Layout erneut.

Dies ist mein Arbeitscode (iOS 8.0 und höher). childController1 wurde auf einem Storyboard mit allen Layouts unter Verwendung von Einschränkungen eingerichtet und mit [self.storyboard instantiateViewControllerWithIdentifier:@"ChildControllerId"] instanziiert.

- (void)createPageController 
{ 
... 
    pageController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil]; 
    pageController.dataSource = self; 
    [pageController setViewControllers:@[childController1] direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:nil]; 
    [self addChildViewController:pageController]; 
    [self.view addSubview:pageController.view]; 
    UIView *pageView = pageController.view; 
    pageView.translatesAutoresizingMaskIntoConstraints = NO; 
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[pageView]|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(pageView)]]; 
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[pageView]|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(pageView)]]; 
    [pageController didMoveToParentViewController:self]; 
... 
} 
- (void)willTransitionToTraitCollection:(UITraitCollection *)newCollection withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator 
{ 
    [pageController.view setNeedsLayout]; 
    [super willTransitionToTraitCollection:newCollection withTransitionCoordinator:coordinator]; 
} 

Ich hoffe, es hilft.