2012-04-13 17 views
6

Tengo un UIViewController que contiene otros ViewControllers. ViewController inicial se establece en viewDidLoad:Rotación de UIPageViewController en Container View Controller

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; 

Este controlador de contenedores ha implementado automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers para volver SÍ. También ha puesto en marcha manualy cambios rotación hacia adelante a ViewControllers no activos

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

Cuando se toca el botón de menú que haga la transición entre ViewControllers.

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

Esta transición funciona bien para mis ViewControllers "normales" y que se muestran correctamente después de los cambios de orientación, incluso si no están activos. Sin embargo, uno de estos Controladores de vista infantil, llamado SecondCV, tiene UIPageViewController como Controlador de vista infantil. Tengo UIPageViewControllerDelegate y UIPageViewControllerDataSource configurado para esta SecondCV y en pageViewController: spineLocationForInterfaceOrientation: vuelvo UIPageViewControllerSpineLocationMin para el retrato y UIPageViewControllerSpineLocationMid para el paisaje. La rotación de este SecondVC funciona correctamente cuando está activo: hay dos páginas en el paisaje y una en el modo vertical que se muestra correctamente. Pero cuando este SecondVC no está activo, la rotación es incorrecta. Incluso si se llama a pageViewController: spineLocationForInterfaceOrientation:, todavía hay una página en el modo vertical y horizontal. Estoy tratando de arreglar esto por un tiempo, pero no veo otras opciones. ¿Tienes alguna idea de cómo solucionar esto?

Gracias.

Respuesta

1

He resuelto este tipo de trampas.

En realidad, el SecondVC se rotó correctamente, o al menos, la ubicación del lomo se modificó correctamente. Así que cuando he girado el dispositivo y el SecondVC no estaba activo, ver el controlador en la vista principal, HA recibió mensajes de rotación y páginaViewController: spineLocationForInterfaceOrientation: se llamó también. Configuré la ubicación de la columna correcta para la nueva orientación de la interfaz y llamé a setViewControllers al controlador de vista de página de SecondVC. El problema era que, incluso si establecía dos controladores de vista para UIPageViewControllerSpineLocationMid, después de mostrar SecondVC solo había uno, como en UIPageViewControllerSpineLocationMin.

que han "fijado" el problema, mediante el establecimiento de los controladores de vista a la página controlador de vista en viewWillAppear: de nuevo, porque cuando se llama a este método, la ubicación columna vertebral para el regulador de vista de la página es correcta y en base a esta información me puse uno , o dos páginas (controladores de vista)

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

yo sé que estoy haciendo lo mismo dos veces, pero eso es el precio que estoy dispuesto a pagar en este caso. Por qué después de llamar al páginaViewController: spineLocationForInterfaceOrientation: y configurar dos controladores de vista para Landscape, cuando SecondVC está inactivo, solo hay un ViewController en m_pageController en viewWillAppear: después de activar SecondVC sigue siendo un misterio para mí.

+0

También estoy usando el controlador de vista de página, y he agregado VC a una matriz, pero no conozco la forma adecuada de transición de varios VC, ¿cómo puedo pasar al siguiente VC usando la transición de curvatura de página? ¿Puedes guiarme por eso o publicar un código de muestra de eso? –

+0

[link] (https://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/CreatingCustomContainerViewControllers/CreatingCustomContainerViewControllers.html) Creo que puede encontrar todo lo que está por aquí, si no, contácteme – DaNY

+0

No tengo ninguna solución aún, por favor eche un vistazo a mi pregunta si puede guiarme. "http://stackoverflow.com/questions/13776894/uipageviewcontroller-change-from-two-page-mode-to-one-page-mode-without-changi#comment18942540_13776894" –

0

I incluyó siguiente código para resolver este problema en 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; 
} 

espero que ayude a alguien!

Cuestiones relacionadas