2012-04-21 1 views
0

Je veux que mon application barre d'onglets avec trois onglets en mode paysage, mais le troisième onglet doit être en portrait.I a fini par convertir l'application tout au paysage en utilisantonglet Storyboard barre paysage orientation de la vue du contrôleur/potrait

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    // Return YES for supported orientations 
    return (interfaceOrientation == UIInterfaceOrientationLandscapeLeft); 
} 

dans tous les contrôleurs de vue en tant qu'application de barre d'onglets, tous les contrôleurs de sous-vue doivent être en paysage pour cela.

Mon fichier .plist a d'abord l'option Lanscape, puis a ajouté le portrait.

Comment faire pour que le troisième onglet passe en mode portrait?

Votre aide est grandement appréciée.

Répondre

2

Le UITabBarController, malheureusement, ne gère pas très bien les contrôleurs de vue avec différentes exigences de rotation. La meilleure façon de gérer cela est de sous-classer UITabBarController et dans shouldAutorotate, de simplement passer la requête au contrôleur de vue qui est à l'écran. Le code ressemblerait à ceci:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
// Let's grab an array of all of the child view controllers of this tab bar controller 
NSArray *childVCArray = self.viewControllers; 

// We know that at 5 or more tabs, we get a "More" tab for free, which contains, assumingly, 
// a more navigation controller 

if (self.selectedIndex <= 3) { 
    UINavigationController *navController = [childVCArray objectAtIndex:self.selectedIndex]; 

    // We're in one of the first four tabs, which we know have a top view controller of UIViewController 
    UIViewController *viewController = navController.topViewController; 

    return [viewController shouldAutorotateToInterfaceOrientation:interfaceOrientation]; 
} 
else { 
    // This will give us a More Navigation Controller 

    UIViewController *viewController = [childVCArray objectAtIndex:self.selectedIndex]; 

    return [viewController shouldAutorotateToInterfaceOrientation:interfaceOrientation]; 
} 

return NO; 
} 

Cela suppose que vous êtes 5+ contrôleurs de vue utilisent plus contrôleur de navigation de la barre d'onglets et ne sont pas eux-mêmes dans leur propre UINavigationController. Si c'était le cas, modifier ce code pour l'adapter serait trivial.

J'ai posté cette sous-classe sur mon github, de sorte que vous pouvez copier cette méthode ou tout simplement saisir les .h/fichiers .m de here

+0

J'ai ajouté vos fichiers pour tabbarcontroller .Edited pour trois onglets. if (self.selectedIndex <= 2) et supprimé le cas d'else pour "more". Dans la troisième vue du contrôleur comme je veux seulement que ce soit en portrait, retourner YES pour (interfaceOrientation == UIInterfaceOrientationPortrait); dans devrait autorotate méthode. Mais ça ne tourne toujours pas au prétrait. Où est-ce que je me trompe? – Senorina

+0

selectedIndex commence à 0, donc si vous avez 3 onglets c'est 0, 1 et 2. Les contrôleurs de vue sont-ils dans UINavigationControllers? Si vous regardez le code, il suppose que le contrôleur de vue de la barre d'onglets est un contrôleur de navigation, et il saisit le contrôleur de vue supérieur de celui-ci. Si vous n'avez que des contrôleurs de vue, nix le truc du contrôleur de nav – jmstone617

+1

Merci pour la réponse jmstone .. La troisième vue n'est pas dans un contrôleur de navigation. Donc je viens d'ajouter UIViewController * viewController = [childVCArray objectAtIndex: self.selectedIndex]; pour selectedIndex == 2 Maintenant, la vue passe en mode portrait lorsque je change l'orientation de l'appareil en portrait. Mais tous les autres onglets deviennent portrait. Je souhaite que la troisième vue soit obligée de s'afficher en mode portrait chaque fois que vous la sélectionnez (pas seulement lorsque l'appareil change d'orientation) .Et les autres onglets doivent toujours rester en mode paysage.Toute suggestion? – Senorina

Questions connexes