2012-04-13 19 views
6

Ho un UIViewController che contiene altri ViewControllers. Iniziale ViewController si trova in viewDidLoad:Rotazione di UIPageViewController in 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; 

Questo controller contenitore ha implementato automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers per tornare SI. Ha inoltre implementato manualy modifiche rotazione in avanti a ViewControllers non attivi

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

Quando il bottone menu viene sfruttato faccio la transizione tra 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; 
    }]; 
} 

Questa transizione funziona bene per i miei ViewControllers "normali" e questi vengono visualizzati correttamente dopo le modifiche di orientamento, anche se non sono attivi. Tuttavia, uno di questi controllori di visione per bambini, denominato SecondCV, ha il UIPageViewController come controller di visualizzazione figlio. Ho UIPageViewControllerDelegate e UIPageViewControllerDataSource insieme a questo SecondCV e in pageViewController: spineLocationForInterfaceOrientation: torno UIPageViewControllerSpineLocationMin per Ritratto e UIPageViewControllerSpineLocationMid per il Paesaggio. La rotazione per questo SecondVC funziona correttamente quando è attiva: ci sono due pagine sul paesaggio e una sulla modalità ritratto visualizzate correttamente. Ma quando questo SecondVC non è attivo, la rotazione non è corretta. Anche se si chiama pageViewController: spineLocationForInterfaceOrientation:, c'è ancora una pagina in modalità verticale e orizzontale. Sto cercando di risolvere questo problema per un po 'di tempo, ma non vedo altre opzioni. Hai qualche idea su come risolvere questo problema?

Grazie.

risposta

1

Ho risolto questo tipo di ingannevole.

In realtà il SecondVC è stato ruotato correttamente, o almeno, la posizione della colonna vertebrale è stata modificata correttamente. Quindi, quando ho ruotato il dispositivo e il SecondVC non era attivo controller vista in visualizzazione padre, è HAS messaggi di rotazione ricevuti e pageViewController: spineLocationForInterfaceOrientation: è stato chiamato anche. Ho impostato la corretta posizione della colonna vertebrale per il nuovo orientamento dell'interfaccia e ho chiamato setViewControllers sul controller di visualizzazione della pagina di SecondVC. Il problema era che, anche se avessi impostato due view controller per UIPageViewControllerSpineLocationMid, dopo aver visualizzato SecondVC ce n'era ancora solo uno, come in UIPageViewControllerSpineLocationMin.

ho "fissa" il problema, impostando vista controllori alla pagina controller della vista in viewWillAppear: di nuovo, perché quando questo metodo viene chiamato, la posizione della colonna vertebrale per il regolatore di visualizzazione della pagina è corretto e in base a queste informazioni ho impostato uno , o due pagine (vista controllori)

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

so che sto facendo la stessa cosa due volte, ma questo è il prezzo che sono disposto a pagare in questo caso. Perché dopo aver chiamato pageViewController: spineLocationForInterfaceOrientation: e impostare due controller di visualizzazione per Landscape, quando SecondVC è inattivo, è solo un ViewController in m_pageController in viewWillAppear: dopo l'attivazione di SecondVC rimane un mistero per me.

+0

Anche io sto usando il controller di visualizzazione di pagina, e ho aggiunto VC a un array, ma non conosco il modo corretto di transizione di vari VC, come posso passare ai VC successivi usando la transizione di arricciatura pagina. Potete per favore guidarmi per quello o postare qualche esempio di codice di esso. –

+0

[link] (https://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/CreatingCustomContainerViewControllers/CreatingCustomContainerViewControllers.html) Penso che tu possa trovare tutto qui, se non, contattami – DaNY

+0

Non ne ho soluzione ancora, per favore dai un'occhiata alla mia domanda se puoi guidarmi. "Http://stackoverflow.com/questions/13776894/uipageviewcontroller-change-from-two-page-mode-to-one-page-mode-without-changi#comment18942540_13776894" –

0

Ho incluso seguente codice per risolvere questo problema in 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; 
} 

Speranza che aiuta qualcuno!

Problemi correlati