11

Voici donc ce que j'ai: Un contrôleur UITabBar qui gère différents contrôleurs UIViewController. Dans l'un des UIViewController j'essaie de changer la vue affichée lorsque l'appareil tourne en mode paysage. la partie importante est que la vue affichée dans le paysage DOIT prendre tout l'écran ...Masquage de TabBar lors de la rotation du périphérique iPhone en mode paysage

J'ai correctement mis en œuvre les méthodes:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation 

En fait j'ai ma rotation se produit correctement, et je me vues échangées. je cache même la barre d'état, la barre de navigation et la barre d'onglet MAIS je continue à avoir un espace vide au bas de l'écran qui est l'endroit du TabBar ...

Donc je suppose que la propriété cachée de la tabBar n'est pas suffisant pour avoir la vue sur tout l'écran. Je pense qu'il y a des choses à faire dans le TabBarController ou même la MainWindow pour dire quelque chose comme "je n'ai pas besoin de TabBarController maintenant". Mais je ne vois pas comment contourner correctement ce problème.

Si quelqu'un a été autour de ce problème, j'apprécierais de l'aide.

merci, Sami.

Répondre

33

Cela a fonctionné pour moi.


- (void)viewDidLoad { 
    [super viewDidLoad];  
    previousRect = self.view.frame; 
} 

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

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration; 
{ 
    if(toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft || toInterfaceOrientation == UIInterfaceOrientationLandscapeRight) {  
     [self.navigationController setNavigationBarHidden:TRUE animated:FALSE]; 
     [[UIApplication sharedApplication] setStatusBarHidden:TRUE animated:FALSE]; 
    } 
    else 
    { 
     [self.navigationController setNavigationBarHidden:FALSE animated:FALSE]; 
     [[UIApplication sharedApplication] setStatusBarHidden:FALSE animated:FALSE]; 
    } 
} 

-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { 
    UIInterfaceOrientation toOrientation = self.interfaceOrientation; 

    if (self.tabBarController.view.subviews.count >= 2) 
    { 
     UIView *transView = [self.tabBarController.view.subviews objectAtIndex:0]; 
     UIView *tabBar = [self.tabBarController.view.subviews objectAtIndex:1]; 

     if(toOrientation == UIInterfaceOrientationLandscapeLeft || toOrientation == UIInterfaceOrientationLandscapeRight) {     
      transView.frame = CGRectMake(0, 0, 480, 320); 
      tabBar.hidden = TRUE; 
     } 
     else 
     {    
      transView.frame = previousRect;  
      tabBar.hidden = FALSE; 
     } 
    } 
} 

+0

Vous avez sauvé ma journée .. merci l'homme ... – Krishnabhadra

+0

+1 aussi pour moi! –

+0

S'il vous plaît marquer comme réponse ... :) Cela fonctionne! –

0

Ce code fonctionne très bien, mais quand je congédie un UIViewController qui est présenté de façon modale, mon avis est sous la barre d'état de 20 pixels. Ma vue est à l'intérieur d'un contrôleur de navigation, donc je ne la cache pas avant la rotation.

+0

j'ai compris que le problème est lié à la barre de navigation et seulement dans IOS 5. Si vous rencontrez des problèmes similaires, il suffit de cacher et d'afficher votre barre de navigation en conséquence. –

1
  • La solution ci-dessus a fonctionné pour moi aussi que quelques petits changements pour iOS6 et au-dessus:
  • à iOS6 supprimer la ligne: "previousRect = self.view.frame;"
  • également remplacer "animés" avec "withAnimation:"
  • et supprimer "transView.frame = previousRect;" à partir du bas (dans la fonction else)
  • Cela fonctionne pour moi de cette façon. Et un grand merci à l'utilisateur UB.
0

je besoin barre d'onglets pour passer en mode plein écran en mode paysage et j'ai essayé l'approche suggérée ci-dessus en utilisant

transView.frame = CGRectMake(0, 0, 480, 320);

Cela est avéré être une solution aki et pose de nombreux problèmes tels que avec masquage et ré-affichage de la barre d'état (la vue chevaucherait la barre d'état lorsqu'elle serait ré-affichée après avoir quitté la vue portrait). Je ne le recommanderais pas. À la fin, ce qui fonctionnait parfaitement, c'était de pousser un nouveau contrôleur de vue contenant la vue paysage et d'utiliser la délégation pour réutiliser la fonctionnalité du circuit virtuel original.

-1

Si vous avez votre UITabBarController, placez un UINavigationController dans celui-ci, alors vous pouvez utiliser hidesBottomBarWhenPushed (avec un peu de supercherie) pour ce faire.

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 
    [super willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration]; 

    if (toInterfaceOrientation == UIInterfaceOrientationPortrait) { 
     self.hidesBottomBarWhenPushed = NO; 
     self.navigationController.viewControllers = self.navigationController.viewControllers; 
     [self transitionToGridLayout]; 
    } 
    else { 
     self.hidesBottomBarWhenPushed = YES; 
     self.navigationController.viewControllers = self.navigationController.viewControllers; 
     [self transitionToCoverflowLayout]; 
    } 
} 

L'astuce est de pousser votre contrôleur de vue afin que le drapeau hidesBottomBarWhenPushed est ramassé. Vous pouvez utiliser suivant.

self.navigationController.viewControllers = self.navigationController.viewControllers; 
0

Cette approche fonctionne pour moi:

- (void) willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 

    UIView *parentView = self.tabBarController.view; 
    CGRect frame = parentView.frame; 
    CGFloat windowHeight = parentView.window.frame.size.height; 

    switch (toInterfaceOrientation) { 
     case UIInterfaceOrientationLandscapeLeft: 
     case UIInterfaceOrientationLandscapeRight: 
      CGFloat tabBarHeight = self.tabBarController.tabBar.frame.size.height; 
      frame.size.height = windowHeight + tabBarHeight; 
      break; 
     default: 
      frame.size.height = windowHeight; 
      break; 
    } 

    [UIView animateWithDuration:duration animations:^{ 
     parentView.frame = frame; 
    }]; 
} 

(testé uniquement en iOS8.)

+0

Ne fonctionne pas sur iPad iOS8 – Borzh

+0

J'ai ce code en cours d'exécution dans une application de production très bien. Que vois-tu? Quelle version d'iOS 8? – StephenT

+0

Essayé iOS 8.2 simulateur la barre d'onglets est affichée pendant la rotation. Btw quelle est la logique: lors de la rotation à la hauteur de la barre de tabulation paysage est augmenté par la hauteur de la fenêtre? – Borzh

0

Sous votre TabBarController et cacher la TabBar en cas de besoin:

class tabBarVC: UITabBarController { 

    override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) { 
     if size.height < size.width { 
      self.tabBar.hidden = true 
     } else { 
      self.tabBar.hidden = false 
     } 
    } 

} 
0

Peut-être vous voulez utiliser ce

- (void)willAnimateRotationToInterfaceOrientation:UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 
{ 
    [super willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration]; 

    __block UIView *weakTabBar = [self.tabBarController.view.subviews objectAtIndex:1]; 
    weakTabBar.alpha = 0; 
    [UIView animateWithDuration:duration 
          delay:0 
         options:UIViewAnimationOptionCurveEaseIn // slow at the beggining 
        animations:^{ 
         weakTabBar.alpha = 1; 
        } 
        completion:^(BOOL finished) { 
         weakTabBar.alpha = 1; 
        }]; 
    } 

}

Cela ne cache pas la barre d'onglets, mais rend l'animation plus fluide rotate.

Questions connexes