13

Mam programowo skonfigurowany kontroler, który ma dziecko UIPageViewController. Wyświetla różne inne kontrolery widoku, które są również programowane. Widoki kontrolerów widoku mają wartość translatesAutoresizingMaskIntoConstraints ustawioną na YES, ale widok kontrolera widoku strony używa wiązań do ustawiania się w kontrolerach widoku z góry.UIPageViewController nie zmienia rozmiaru kontrolek podrzędnych

Problem polega na tym, że gdy użytkownik obraca urządzenie, kontroler widoku zmienia rozmiar ramki, ale jego kontrolki widoku podrzędnego tego nie robią. Po didRotateFromInterfaceOrientation jego ramka nadal znajduje się w starej orientacji. Sprawdziłem, że metody rotacji są wywoływane na kontrolerach podrzędnych, ich ramka po prostu się nie zmienia.

skonfigurować kontroler widoku strona takiego:

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

Próbowałem nazywając setNeedsLayout ale to niezdarny animacja rotacji i następną stronę, że jest nie do machnięcia również odpowiednio przeskalowane.

Dlaczego kontroler widoku nie zmienia rozmiaru kontrolek podrzędnych i jak mogę to zrobić?

Dzięki!

+0

Czy znalazłeś rozwiązanie swojego problemu? Utknąłem z tym samym problemem. – AlexR

+0

Problem polega na tym, że -didRotateFromInterfaceOrientation na kontrolerach podrzędnych nigdy nie jest wywoływany. Rozwiązałem go ręcznie, wywołując go z nadrzędnych kontrolerów widoku -didRotateFromInterfaceOrientation. –

+0

Jaka jest metoda kontrolera widoku Clild View do wywoływania zmiany orientacji? – Satyam

Odpowiedz

-1

Dodanie widoku kontrolera bezpośrednio do widoku innego kontrolera i oczekiwanie na wywołanie metod rotacji i cyklu życia nie jest najlepszą polityką. Czuję, że dodanie go do hierarchii kontrolera może zadziałać, ale nie mogę wiele na ten temat komentować.

Testowałem za pomocą nawigatora paska kart i mój UIPageViewController otrzymał zdarzenia wraz ze sterownikiem, który był wyświetlany w UIPageViewController. Zgaduję, że jeśli popchnę kontroler do kontrolera UINavigationController, otrzymam ten sam wynik.

Polecam pokazać swój UIPageVIewController w bardziej standardowy sposób niż dodanie jego widoku do widoku innego kontrolera.

+0

Nie jest konieczne, aby kontroler widoku strony zawsze był pełny. Na urządzeniu takim jak iPad może być częścią widoku. I tak musi zostać wdrożone, jak wspomniano w pytaniu. Popraw mnie, jeśli jest jakikolwiek inny sposób, aby to osiągnąć. – Satyam

6

Najpierw skonfiguruj wszystko za pomocą automatycznego układu, programowo lub scenopis. Następnie przechwyć zmianę orientacji w kontrolerze nadrzędnym i zmuś widok UIPageViewController do ponownego układu.

To jest mój działający kod (iOS 8.0 i późniejsze). childController1 został skonfigurowany na Storyboard z całym układem przy użyciu wiązań i utworzony przy pomocy [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]; 
} 

Mam nadzieję, że to pomaga.

Powiązane problemy