2010-03-14 3 views
0

J'utilise un contrôleur tabBar comme contrôleur racine. Il dispose de 4 onglets et chacun de ses ViewControllers aL'écran de l'iPhone tourne au hasard?

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation { 
     return YES; 
} 

ainsi que le tabBarController lui-même. Mais quand je fais tourner l'appareil (réel ou simulateur), l'écran tourne au hasard! Si elle ne tourne pas lorsque j'ouvre l'application, elle aura le même comportement jusqu'à ce que je quitte l'application. J'ai essayé d'ajouter les 4 viewControllers un par un dans IB pour voir si l'un d'entre eux était problématique, mais j'ai obtenu le même problème. Il ne tourne toujours que lorsqu'il n'y a pas d'onglets du tout!

S'il vous plaît dites-moi si vous avez des idées. Merci!

Répondre

0

Je trouve que si vous définissez l'onglet sélectionné par programme le tabViewController tourne de façon erratique.

0

Vous avez sous-classe UITabBarController et mettre en œuvre shouldAutorotateToInterfaceOrientation:

+0

Mon tabBarController actuel est actuellement une sous-classe de UITabBarController et j'ai déjà implémenté cette fonction. – Baldoph

1

Vous définissez chaque contrôleur de vue de dire qu'il répond à une orientation possible. Par conséquent, chaque vue tentera de tourner à chaque orientation.

Les vues ne pivotent pas automatiquement. Vous devez généralement gérer le placement de la sous-vue par programme dans toutes les vues sauf les plus simples.

Si vous n'avez pas de code d'orientation personnalisé, vous voyez probablement les vues qui tentent de dessiner la vue portrait dans le cadre paysage ou vice versa. Si vous avez autoresize subviews définir vos vues semblent apparaître sur l'écran dans un modèle apparemment aléatoire. Plus vous changez d'orientation, plus le placement devient aléatoire.

Pour les vues complexes, j'aime créer des paires vueController/vue séparées pour chaque orientation. Ensuite, je mets les vues dans un contrôleur de nav. Au fur et à mesure que l'orientation change, chaque contrôleur de vue va pousser ou ouvrir le contrôleur de vue approprié pour l'orientation à venir sur/hors de la pile. Pour l'utilisateur, cela ressemble à une vue unique se redessine gracieusement. (Ceci est particulièrement utile si vous avez des éléments d'interface utilisateur non standard qui doivent être tournés manuellement avec des transformations)

0

En fait, je veux juste que mon premier contrôleur de vue à onglets tourne. J'ai donc mis ce code dans mon onglet personnalisé BarController:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation { 
     if (self.selectedIndex == 0) { 
      return toInterfaceOrientation != UIInterfaceOrientationPortraitUpsideDown; 
     }else { 
      return toInterfaceOrientation == UIInterfaceOrientationPortrait; 
     } 
} 

mais j'ai eu le même problème. J'utilise un code d'orientation personnalisé pour mon premier contrôleur de vue à onglets lorsque je passe en mode paysage. Été avec la fonction suivante dans mon tabBarcontroller personnalisé:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 
    if (toInterfaceOrientation == UIInterfaceOrientationPortrait) { 
     //rotation to Portrait 
     lastOrientation = toInterfaceOrientation; 
     [[UIApplication sharedApplication] setStatusBarHidden:NO animated:NO]; 
     [self.selectedViewController willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration]; 
    } 
    else if (UIInterfaceOrientationIsLandscape(toInterfaceOrientation)) { 
     if (!UIInterfaceOrientationIsLandscape(lastOrientation)) { 
      //rotation to Landscape 
      [self.selectedViewController willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration]; 
     } 
     lastOrientation = toInterfaceOrientation; 
    } 
}