在容器视图控制器中旋转UIPageViewController

6

我有一个包含其他视图控制器的UIViewController。在viewDidLoad中设置初始视图控制器:

FirstViewController *first = [FirstViewController alloc] init];
first.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
first.view.frame = m_content.frame;

[self addChildViewController:first];
[m_content.view addSubview:first.view];
[first didMoveToParentViewController:self];
m_activeViewController = first;

该容器控制器已经实现了automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers方法并返回了YES。它还实现了将旋转变化手动转发给非活跃的视图控制器。

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return YES;
}
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
    for(UIViewController *vc in m_viewControllers)
    {
        if(vc != [m_activeViewController]
            [vc willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
    }
}
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
    for(UIViewController *vc in m_viewControllers)
    {
        if(vc != [m_activeViewController]
            [vc didRotateFromInterfaceOrientation:fromInterfaceOrientation];
    }
}

当菜单按钮被点击时,我会在视图控制器之间进行转换。
- (void)onMenuItemTapped:(id)sender
{
    UIViewController *vc = [m_viewControllers objectAtIndex:sender.tag];

    vc.view.frame = m_content.frame;
    [self addChildViewController:vc];
    [self transitionFromViewController:m_activeViewController toViewController:vc duration:0 options:UIViewAnimationOptionTransitionNone animations:nil completion:^(BOOL finished) {
    [vc didMoveToParentViewController:self];
    [m_activeViewController removeFromParentViewController];
    m_activeViewController = vc;
    }];
}

这个转换对于我“普通”的视图控制器来说是可以正常工作的,即使它们不是活动状态,在方向改变后也会正常显示。然而,其中一个子视图控制器称为SecondCV,它有一个UIPageViewController作为子视图控制器。我已经将UIPageViewControllerDelegate和UIPageViewControllerDataSource设置为这个SecondCV,并在pageViewController:spineLocationForInterfaceOrientation:中返回了Portrait的UIPageViewControllerSpineLocationMin和Landscape的UIPageViewControllerSpineLocationMid。当这个SecondVC处于活动状态时,它的旋转是正确的 - 两个页面在横向模式下,一个页面在纵向模式下都被正确地显示。但当这个SecondVC不活动时,旋转是不正确的。即使调用了pageViewController:spineLocationForInterfaceOrientation:, 在纵向和横向模式下仍然只有一个页面。我试图解决这个问题有一段时间了,但我没有看到其他任何选择。你有没有什么想法如何解决这个问题?
谢谢。
2个回答

1

我已经解决了这种棘手的问题。

实际上,SecondVC已经正确旋转,或者至少脊柱位置已经正确更改。所以当我旋转设备时,SecondVC不是父视图中的活动视图控制器,它仍然接收到旋转消息,并且也调用了pageViewController:spineLocationForInterfaceOrientation:。我为新的界面方向设置了正确的脊柱位置,并调用了SecondVC的页面视图控制器的setViewControllers。问题在于,即使我将两个视图控制器设置为UIPageViewControllerSpineLocationMid,在显示SecondVC后,仍然只有一个,就像在UIPageViewControllerSpineLocationMin中一样。

我通过在viewWillAppear:中再次将视图控制器设置为页面视图控制器来“修复”问题,因为当调用此方法时,页面视图控制器的脊柱位置是正确的,并且基于此信息,我设置了一个或两个页面(视图控制器)。

- (void)viewWillAppear:(BOOL)animated
{
if(m_pageController.spineLocation == UIPageViewControllerSpineLocationMid)
{
    LeftPageController *left;
    RightPageController *right;
    if(m_pageController.viewControllers.count > 0)
    {
        left = [m_pageController.viewControllers objectAtIndex:0];

        right = [m_storyboard instantiateViewControllerWithIdentifier:@"rightPage"];
        [right loadView];
    }

    [m_pageController setViewControllers:[NSArray arrayWithObjects:left, right, nil] direction:UIPageViewControllerNavigationDirectionForward | UIPageViewControllerNavigationDirectionReverse animated:NO completion:nil];

    [m_left hideGallery];
}

if(m_pageController.spineLocation == UIPageViewControllerSpineLocationMin)
{

    [m_pageController setViewControllers:[NSArray arrayWithObject:[m_pageController.viewControllers objectAtIndex:0]] direction:UIPageViewControllerNavigationDirectionForward | UIPageViewControllerNavigationDirectionReverse animated:NO completion:nil];
}

[super viewWillAppear:animated];
}


- (UIPageViewControllerSpineLocation)pageViewController:(UIPageViewController *)pageViewController spineLocationForInterfaceOrientation:(UIInterfaceOrientation)orientation
{
if(UIInterfaceOrientationIsPortrait(orientation))
{
    LeftPageController *left = [pageViewController.viewControllers objectAtIndex:0];
    [pageViewController setViewControllers:[NSArray arrayWithObject:left] direction:UIPageViewControllerNavigationDirectionForward | UIPageViewControllerNavigationDirectionReverse animated:NO completion:nil];

    pageViewController.doubleSided = NO;     

    return UIPageViewControllerSpineLocationMin;
}

if(UIInterfaceOrientationIsLandscape(orientation))
{    
    LeftPageController *left;
    RightPageController *right;
    if(pageViewController.viewControllers.count > 0)
    {
        left = [pageViewController.viewControllers objectAtIndex:0];
        right = [m_storyboard instantiateViewControllerWithIdentifier:@"rightPage"];
        [right loadView];
    }

    [pageViewController setViewControllers:[NSArray arrayWithObjects:left,right, nil] direction:UIPageViewControllerNavigationDirectionForward | UIPageViewControllerNavigationDirectionReverse animated:NO completion:nil];

    return UIPageViewControllerSpineLocationMid;
}

return UIPageViewControllerSpineLocationMin;
}

我知道我在做同样的事情两次,但这是我愿意为此付出的代价。为什么在调用pageViewController:spineLocationForInterfaceOrientation:并为横向设置了两个视图控制器后,当SecondVC处于非活动状态时,在激活SecondVC后,在viewWillAppear:中m_pageController中只有一个视图控制器,这仍然是个谜。


我也在使用页面视图控制器,并将VC添加到数组中,但不知道如何正确地过渡到各种VC。我该如何使用翻页卷曲转换移动到下一个VC?你能否指导我或者提供一些示例代码? - user1573321
请点击以下链接:https://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/CreatingCustomContainerViewControllers/CreatingCustomContainerViewControllers.html如果找不到需要的内容,请联系我。 - DaNY
我还没有找到任何解决方案,请看一下我的问题,如果您能指导我。 "http://stackoverflow.com/questions/13776894/uipageviewcontroller-change-from-two-page-mode-to-one-page-mode-without-changi#comment18942540_13776894" - iPhone Programmatically

0
我在iOS 6中包含了以下代码来解决这个问题:
- (UIPageViewControllerSpineLocation)pageViewController:(UIPageViewController *)pageViewController spineLocationForInterfaceOrientation:(UIInterfaceOrientation)orientation
{

    NSArray *allPageControllers = pageViewController.viewControllers

    if (allPageControllers != nil) {
       [self setViewControllers:allPageControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];
    }

    else {

       UIViewController *defaultViewController = [[UIViewController alloc] init];
       [self setViewControllers:[NSArray arrayWithObject:defaultViewController] direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];
       [defaultViewController release];
    }

    return UIPageViewControllerSpineLocationMin;
}

希望能对某人有所帮助!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接