2010-09-10 7 views
0

J'ai un TabbarController avec différents ViewControllers. Certains de ces ViewControllers doivent être autorotés et un ViewController ne doit être présenté que dans PORTRAIT. Je remplir le Tabbar avec la procédure suivante:Problème de rotation UIViewController

ChartThemeViewController *chartViewController = [[ChartThemeViewController alloc] 
                  initWithTheme:chartThemeDict]; 
UINavigationController *theNavigationController = [[UINavigationController alloc] 
                  initWithRootViewController:chartViewController]; 
[chartViewController release]; 
[localViewControllersArray addObject:theNavigationController]; 
[theNavigationController release]; 

tabBarController.viewControllers = localViewControllersArray; 

Le ChartThemeViewController est une sous-classe de ThemeViewController. ThemeViewController est une sous-classe de UIViewController.

Si je substitue 'shouldAutorotateToInterfaceOrientation' dans les sous-classes de ThemeViewController, et renvoie YES dans toutes les sous-classes et renvoie NO dans ChartThemeViewController ... il arrive que tous les ViewControllers ne autorotent pas.

Mmmmhhh ... espérons que vous pouvez comprendre ...

Comment puis-je résoudre ce problème?

merci beaucoup jens

Répondre

0

je crois que le truc à sélectifs autorotation dans une instance de UITabBarController est la suivante: Sous UITabBarController et passer outre la méthode - (BOOL) shouldAutorotateToInterfaceOrientation: ce qui suit:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    return [[self selectedViewController] shouldAutorotateToInterfaceOrientation:interfaceOrientation]; 
}; 

Maintenant, si vous sélectionnez votre onglet portrait et que vous faites pivoter en mode paysage, l'application reste en mode portrait.

Un nouveau problème ici, cependant, est le suivant: sélectionnez un onglet que prend en charge; tourner au paysage; sélectionnez un onglet qui ne supporte que le portrait. Oh oh. Le contrôleur de vue uniquement en mode portrait est affiché en mode paysage. Malheureusement, il n'y a aucun moyen de forcer un contrôleur de vue à une orientation spécifique.

Vous pouvez regarder ici pour une description du problème: How to force a screen orientation in specific view controllers?

Comme vous pouvez le voir, il n'y a pas de solution réelle.

Je vous recommande de désactiver tous les onglets qui ne supportent pas l'orientation actuelle. Vous pouvez remplacer - (void) didAutorotateToInterfaceOrientation: dans votre sous-classe UITabBarController avec les éléments suivants pour y parvenir:

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation 
{ 
    UIInterfaceOrientation toInterfaceOrientation = [[UIApplication sharedApplication] statusBarOrientation]; 
    NSArray *items = [[self tabBar] items]; 
    for (NSUInteger i = 0; i < [items count]; i ++) 
    { 
     UITabBarItem *item = [items objectAtIndex:i]; 
     if (![[[self viewControllers] objectAtIndex:i] shouldAutorotateToInterfaceOrientation:toInterfaceOrientation]) 
     { 
      [item setEnabled:NO]; 
     } 
     else 
     { 
      [item setEnabled:YES]; 
     }; 
    }; 
}; 

Si vous ne souhaitez pas le faire, alors envisager de modifier votre interface pour pouvoir supporter les mêmes orientations en tous vos contrôleurs de vue.

Hope this helps,

Ryan

+0

Merci pour cette réponse. – xnz

Questions connexes