2012-04-13 5 views
6

Ich habe einen UIViewController, der andere ViewControllers enthält. Anfängliche Viewcontroller wird in viewDidLoad gesetzt:Rotation von 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; 

Dieser Container-Controller implementiert hat automaticallyForwardAppearanceAndRotationMethodsToChildViewControllers zurückzukehren YES. Es hat sich auch

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

Wenn Menütaste i den Übergang zwischen Viewcontrollers machen abgegriffen manuell die Vorwärtsdrehung Änderungen nicht aktiv Viewcontrollers implementiert.

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

Dieser Übergang arbeitet für meinen „normalen“ Viewcontrollers in Ordnung, und sie sind richtig nach der Orientierung Änderungen angezeigt, auch wenn sie nicht aktiv sind. Einer dieser Unteransicht-Controller, SecondCV genannt, hat jedoch UIPageViewController als Unteransicht-Controller. Ich habe UIPageViewControllerDelegate und UIPageViewControllerDataSource Satz dieser SecondCV und in pageViewController: spineLocationForInterfaceOrientation: Ich kehre UIPageViewControllerSpineLocationMin für Portrait und UIPageViewControllerSpineLocationMid für Landschaft. Die Drehung für dieses SecondVC funktioniert ordnungsgemäß, wenn es aktiv ist - es sind zwei Seiten in der Landschaft und eine im Portrait-Modus korrekt angezeigt. Aber wenn dieser SecondVC nicht aktiv ist, ist die Rotation falsch. Auch wenn pageViewController: spineLocationForInterfaceOrientation: aufgerufen wird, gibt es im Hoch- und Querformat immer noch eine Seite. Ich versuche, das für einige Zeit zu beheben, aber ich sehe keine anderen Optionen. Hast du irgendwelche Ideen, wie das zu beheben ist?

Vielen Dank.

Antwort

1

Ich habe diese Art von knifflig gelöst.

Tatsächlich wurde die SecondVC korrekt gedreht, oder zumindest die Position der Wirbelsäule wurde korrekt geändert. Also, wenn ich das Gerät gedreht habe und der SecondVC war nicht aktiv View-Controller in der übergeordneten Ansicht, es HAS erhielt Rotationsmeldungen und pageViewController: spineLocationForInterfaceOrientation: wurde auch aufgerufen. Ich legte den richtigen Rücken Position für neue Schnittstelle Ausrichtung und rief setViewControllers zu SecondVC Seitenansicht Controller. Problem war, dass, selbst wenn ich zwei View-Controller für UIPageViewControllerSpineLocationMid, nach der Anzeige von SecondVC gab es immer noch nur eine, wie in UIPageViewControllerSpineLocationMin.

I „fixed“ das Problem haben, durch View-Controller auf Seite View-Controller in viewWillAppear Einstellung: wieder, denn wenn diese Methode aufgerufen wird, Wirbelsäule Standort für Controller Seitenansicht korrekt ist und auf der Grundlage dieser Informationen i eins gesetzt oder zwei Seiten (view-Controller)

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

ich weiß, dass ich die gleiche Sache zweimal tue, aber das ist der Preis, den ich bereit bin, in diesem Fall zu zahlen. Warum nach dem Aufruf pageViewController: spineLocationForInterfaceOrientation: und Einstellung zwei View-Controller für Querformat, wenn SecondVC inaktiv ist, ist nur ein ViewController in m_pageController in viewWillAppear: nach der Aktivierung SecondVC bleibt ein Rätsel für mich.

+0

Ich verwende zu Seite View-Controller, und ich habe zu einer Reihe von VC hinzugefügt, aber nicht wissen, die richtigen Art und Weise verschiedene VCs des Übergangs, wie kann ich zum nächsten VCs mit Seitenrotation Übergang zu bewegen. Können Sie das, oder einige Beispiel-Code von Post-It führen Sie mich bitte. –

+0

[link] (https://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/CreatingCustomContainerViewControllers/CreatingCustomContainerViewControllers.html) Ich denke, Sie können alles hier finden, wenn nicht, kontaktieren Sie mich – DaNY

+0

Ich habe keine Lösung noch, bitte einen Blick auf meine Frage, wenn du mich führen kann. "Http://stackoverflow.com/questions/13776894/uipageviewcontroller-change-from-two-page-mode-to-one-page-mode-without-changi#comment18942540_13776894" –

0

I enthalten folgenden Code, um dieses Problem in iOS 6 zu lösen:

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

Hoffen, dass es jemanden hilft!

Verwandte Themen