UIPageViewController не изменяет размеры своих дочерних контроллеров - программирование

UIPageViewController не изменяет размеры своих дочерних контроллеров

У меня есть контроллер просмотра, программно программируемый, у которого есть дочерний UIPageViewController. Это отображает различные другие контроллеры представлений, которые также настроены программно. В представлениях диспетчеров вида translatesAutoresizingMaskIntoConstraints установлено значение YES, но в представлении контроллера просмотра страницы используются ограничения, чтобы позиционировать себя в контроллере верхнего уровня.

Проблема в том, что когда пользователь поворачивает устройство, контроллер просмотра страницы изменяет размер своего фрейма, но его контроллеры дочерних представлений этого не делают. В didRotateFromInterfaceOrientation его рамка по-прежнему находится в старой ориентации. Я проверил, что методы вращения вызываются на контроллерах дочерних представлений, их кадр просто не изменяется.

Я установил контроллер просмотра страницы следующим образом:

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

Я пробовал называть setNeedsLayout, но это неуклюжая анимация вращения, и следующая страница, которую я прокручиваю, тоже не изменена.

Почему контроллер просмотра страниц не изменяет размеры своих дочерних контроллеров представления и как мне его заставить?

Спасибо!

4b9b3361

Ответ 1

Сначала настройте все с помощью автоматического макета, программно или раскадровки. Затем перехватите изменение ориентации в контроллере родительского представления и снова включите представление UIPageViewController.

Это мой рабочий код (iOS 8.0 и новее). childController1 был настроен на раскадровке со всеми макетами с использованием ограничений и создан с помощью [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];
}

Надеюсь, что это поможет.

Ответ 2

Добавление представления контроллера непосредственно в другое представление контроллера и ожидание того, что методы вращения и жизненного цикла, которые будут называться, не являются лучшей политикой. Я как бы чувствую, что добавление его в иерархию контроллера может работать, но я не могу много комментировать.

Я тестировал с помощью навигатора панели вкладок, и мой UIPageViewController получил события вместе с контроллером, который показывался в UIPageViewController. Я предполагаю, что если я нажму контроллер в UINavigationController, я получу тот же результат.

Я бы рекомендовал вам показать ваш UIPageVIewController более стандартным способом, чем добавить его в режим просмотра другого контроллера.