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
, но это неуклюжая анимация вращения, и следующая страница, которую я прокручиваю, тоже не изменена.
Почему контроллер просмотра страниц не изменяет размеры своих дочерних контроллеров представления и как мне его заставить?
Спасибо!
Ответы
Ответ 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 более стандартным способом, чем добавить его в режим просмотра другого контроллера.