11

Quindi ecco quello che ho: Un UITabBarController che gestisce diversi UIViewControllers. In uno di UIViewController sto provando a cambiare la vista visualizzata quando il dispositivo ruota in orizzontale. la parte importante è che la vista visualizzata nel paesaggio devono prendere l'intero schermo ...nascondere TabBar durante la rotazione del dispositivo iPhone in orizzontale

ho attuato correttamente i metodi:

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

In realtà io ho la mia rotazione che si verificano in modo corretto, e ho il mio viste scambiate. nascondo persino la barra di stato, la barra di navigazione e la barra delle schede MA tengo uno spazio vuoto nella parte inferiore dello schermo che è il posto del TabBar ...

Quindi presumo che l'impostazione della proprietà nascosta del tabBar non è sufficiente per avere la vista su tutto lo schermo. Penso che ci sia qualcosa da fare all'interno del TabBarController o anche nella MainWindow per dire qualcosa come "non ho bisogno di TabBarController ora". Ma non vedo come aggirare questo problema correttamente.

Se qualcuno ha avuto questo problema, gradirei un aiuto.

grazie, Sami.

risposta

33

Questo ha funzionato per me.


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

Hai salvato la mia giornata..grazie ... – Krishnabhadra

+0

+1 anche per me! –

+0

Per favore segna come risposta ... :) Funziona!) –

0

Questo codice funziona bene, ma quando ho licenziare un UIViewController che viene presentato modale, la mia opinione è sotto la barra di stato del 20 pixel. La mia vista è all'interno di un controller di navigazione, quindi non lo nascondo prima della rotazione.

+0

ho capito che il problema è relativo alla barra di navigazione e solo in IOS 5.Se riscontrate problemi simili nascondete e mostrate la barra di navigazione di conseguenza in visualizzazione. –

1
  • La soluzione di cui sopra ha funzionato per me anche solo alcuni piccoli cambiamenti per iOS6 e soprattutto:
  • in iOS6 rimuovere la riga: "previousRect = self.view.frame;"
  • anche sostituire "animati:" con "withAnimation:"
  • e rimuovere "transView.frame = previousRect;" dal basso (nella funzione else)
  • Funziona in questo modo. E grazie mille all'utente UB.
0

avevo bisogno barra delle schede per entrare in modalità a schermo intero con orientamento orizzontale e ho provato l'approccio suggerito sopra utilizzando

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

Questa si è rivelata una soluzione hacky e poste molti problemi come nascondendo e visualizzando nuovamente la barra di stato (la vista si sovrapporrà alla barra di stato quando viene nuovamente visualizzata dopo l'uscita dalla visualizzazione verticale). Non lo consiglierei. Ciò che ha funzionato perfettamente alla fine è stato spingere un nuovo controller di visualizzazione contenente la vista orizzontale e utilizzare la delega per riutilizzare la funzionalità del VC originale.

-1

Se hai il tuo UITabBarController allora metti un UINavigationController al suo interno, allora puoi usare hidesBottomBarWhenPushed (con un po 'di inganno) per fare questo.

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

Il trucco è quello di spingere il vostro controller della vista in modo che la bandiera hidesBottomBarWhenPushed viene prelevato. Puoi usare il seguente

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

Questo approccio sta lavorando per me:

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

(testato solo in iOS 8.)

+0

Non funziona su iPad iOS8 – Borzh

+0

Ho questo codice in esecuzione in un'app di produzione bene. Cosa stai vedendo? Quale versione di iOS 8? – StephenT

+0

Il simulatore iOS 8.2 provato mostra la barra delle schede durante la rotazione. A proposito, qual è la logica: quando si ruota in orizzontale, l'altezza della cornice è aumentata dall'altezza della finestra? – Borzh

0

sottoclasse tua TabBarController e nascondere il TabBar quando necessario:

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

Forse vuoi usare questo

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

}

Questo non nasconde la barra delle schede, ma rende l'animazione rotazione fluida.

Problemi correlati