13

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

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

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

Спасибо!

+0

Вы нашли решение по вашей проблеме? Я застрял с той же проблемой. – AlexR

+0

Проблема в том, что -didRotateFromInterfaceOrientation на дочерних контроллерах никогда не вызывается. Я решил это, вручную вызвав его из родительских контроллеров представления -didRotateFromInterfaceOrientation. –

+0

Какой метод на контроллере просмотра clild вы вызываете для обработки изменения ориентации? – Satyam

ответ

-1

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

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

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

+0

Не нужно, чтобы контроллер просмотра страниц всегда был полноэкранным. На устройстве, таком как iPad, оно может быть частью представления. И это должно быть реализовано, как указано в вопросе. Исправьте меня, если есть какой-либо другой способ его достижения. – Satyam

6

Во-первых, настройте все с автоматической компоновкой, программно или раскадровки. Затем перехватите изменение ориентации в контроллере родительского представления и снова включите представление 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]; 
} 

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