Ios UIPageViewController未调整其子视图控制器的大小
我以编程方式设置了一个视图控制器,它有一个子Ios UIPageViewController未调整其子视图控制器的大小,ios,constraints,autolayout,uipageviewcontroller,autorotate,Ios,Constraints,Autolayout,Uipageviewcontroller,Autorotate,我以编程方式设置了一个视图控制器,它有一个子UIPageViewController。这将显示也以编程方式设置的各种其他视图控制器。这些视图控制器的视图将“translatesAutoresizingMaskIntoConstraints设置为“是”,但页面视图控制器的视图使用约束将其自身定位在俯视图控制器中 问题是,当用户旋转设备时,页面视图控制器会调整其框架的大小,但其子视图控制器不会。通过didRotateFromInterfaceOrientation,它的帧仍然来自旧的方向。我已经验证
UIPageViewController
。这将显示也以编程方式设置的各种其他视图控制器。这些视图控制器的视图将“translatesAutoresizingMaskIntoConstraints设置为“是”,但页面视图控制器的视图使用约束将其自身定位在俯视图控制器中
问题是,当用户旋转设备时,页面视图控制器会调整其框架的大小,但其子视图控制器不会。通过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
,但这是一个笨拙的旋转动画,我滑动到的下一页也没有正确调整大小
为什么页面视图控制器不调整其子视图控制器的大小,我如何让它这样做
谢谢 将一个控制器的视图直接添加到另一个控制器的视图中,并期望调用旋转和生命周期方法并不是最好的策略。我有点觉得把它添加到控制器层次结构中是可行的,但是我不能对此做太多评论 我使用选项卡栏导航器进行了测试,我的UIPageViewController获得了事件以及显示在UIPageViewController中的控制器。我猜如果我将控制器推入UINavigationController,我将得到相同的结果
我建议您以更标准的方式显示UIPageVIewController,而不是将其视图添加到另一个控制器的视图中。首先,使用自动布局、编程或情节提要设置所有内容。然后,捕获父视图控制器中的方向更改,并强制UIPageViewController的视图重新布局 这是我的工作代码(iOS 8.0及更高版本)
childController1
是在故事板上设置的,所有布局都使用约束,并使用[self.Storyboard InstanceEviewController WithiIdentifier:@“ChildControllerId”]
进行实例化
-(无效)createPageController
{
...
pageController=[[UIPageViewController alloc]initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal选项:nil];
pageController.dataSource=self;
[pageController设置视图控制器:@[childController1]方向:UIPageViewControllerNavigationDirectionForward动画:是完成:无];
[self-addChildViewController:pageController];
[self.view addSubview:pageController.view];
UIView*pageView=pageController.view;
pageView.TranslatesAutoResizezingMaskintoConstraints=否;
[self.view addConstraints:[nsLayoutConstraintsWithVisualFormat:@“H:|[pageView]|”选项:0指标:无视图:NSDictionaryOfVariableBindings(pageView)];
[self.view addConstraints:[nsLayoutConstraintsWithVisualFormat:@“V:|[pageView]|”选项:0指标:无视图:NSDictionaryOfVariableBindings(pageView)];
[pageController-didMoveToParentViewController:self];
...
}
-(void)将TransitionToTraitCollection:(UITraitCollection*)使用TransitionCoordinator:(id)coordinator的新集合
{
[pageController.view setNeedsLayout];
[super Will TransitionToTraitCollection:newCollection with TransitionCoordinator:coordinator];
}
希望有帮助。您找到解决问题的方法了吗?我也遇到了同样的问题。问题是子控制器上的-didRotateFromInterfaceOrientation从未被调用。我通过从父视图控制器-DidRotateFrominerFaceOrientation手动调用解决了这个问题。您在clild视图控制器上调用什么方法来处理方向更改?我有相同的问题,但不是旋转,而是多任务视图。如果您发现了任何解决方案,请与他人分享。页面视图控制器不必总是全屏显示。在像iPad这样的设备上,它可以成为视图的一部分。因此,它必须按照问题中提到的那样实施。如果还有其他方法,请纠正我。
- (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];
}