Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios UIPageViewController未调整其子视图控制器的大小_Ios_Constraints_Autolayout_Uipageviewcontroller_Autorotate - Fatal编程技术网

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