13

Ho un controller di visualizzazione impostato a livello di programmazione che ha un figlio UIPageViewController. Questo visualizza vari altri controller di visualizzazione che sono anche impostati a livello di programmazione. Le viste di queste view controller sono impostate su translatesAutoresizingMaskIntoConstraints impostato su YES, ma la vista del controller di visualizzazione di pagina utilizza i vincoli per posizionarsi nel controller di visualizzazione superiore.UIPageViewController non ridimensiona i suoi controller di visualizzazione figlio

Il problema è che quando l'utente ruota il dispositivo, il controller della visualizzazione di pagina ridimensiona il suo frame ma i suoi controller di vista figlio no. Con didRotateFromInterfaceOrientation, la cornice è ancora dal vecchio orientamento. Ho verificato che i metodi di rotazione sono richiamati sui controller di visualizzazione figlio, ma la loro cornice non cambia.

Mi è stata controller della vista pagina come questa:

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]; 

Ho provato a chiamare setNeedsLayout ma è un'animazione di rotazione goffo e la pagina successiva che Swipe per non anche ridimensionata correttamente.

Perché il controller della visualizzazione di pagina non ridimensiona i suoi controller di visualizzazione figlio e come posso farlo?

Grazie!

+0

Hai trovato una soluzione al tuo problema? Sono bloccato con lo stesso problema. – AlexR

+0

Il problema è che -didRotateFromInterfaceOrientation sui controller figlio non viene mai chiamato. L'ho risolto manualmente chiamandolo dai controller della vista genitore -didRotateFromInterfaceOrientation. –

+0

Qual è il metodo su Clild View Controller stai chiamando per gestire la modifica dell'orientamento? – Satyam

risposta

-1

Aggiungendo la vista di un controller direttamente nella vista di un altro controllore e aspettandosi che i metodi di rotazione e di ciclo di vita da chiamare non è la migliore politica. Mi sento come se aggiungerlo alla gerarchia del controller potesse funzionare, ma non posso commentare molto su di esso.

Ho eseguito il test con un navigatore con barra delle linguette e il mio UIPageViewController ha ottenuto gli eventi insieme al controller mostrato in UIPageViewController. Immagino che se spingo il controller su un UINavigationController otterrò lo stesso risultato.

Si consiglia di mostrare il proprio UIPageVIewController in un modo più standard rispetto all'aggiunta della vista a un'altra vista del controller.

+0

Non è necessario che il controller di visualizzazione di pagina sia sempre a schermo intero. Su un dispositivo come iPad, può essere parte della vista. E quindi deve essere implementato come menzionato nella domanda. Correggimi se c'è un altro modo per raggiungerlo. – Satyam

6

Innanzitutto, imposta tutto con il layout automatico, a livello di codice o Storyboard. Quindi, prendere la modifica dell'orientamento nel controllore della vista genitore e forzare nuovamente la vista di UIPageViewController sul layout.

Questo è il mio codice di lavoro (iOS 8.0 e versioni successive). childController1 è stato impostato su uno Storyboard con tutto il layout utilizzando i vincoli e istanziato con [self.storyboard instantiateViewControllerWithIdentifier:@"ChildControllerId"].

- (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]; 
} 

Spero che sia d'aiuto.