2009-02-10 2 views
7

Ho un'app basata su tabbar.Come ruotare la vista in orizzontale in un'app tabbar

Costruisco 2 viste, una in verticale e un'altra in modalità orizzontale in Interface Builder.

Ora, voglio qualcosa di simile all'app iPod. Voglio che la vista orizzontale sia a schermo intero e nascondi la barra delle tabulazioni & nella barra di stato.

Faccio lavorare il di base di questo:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation 
           duration:(NSTimeInterval)duration { 
    if (self.landscape) { 
     if (toInterfaceOrientation == UIInterfaceOrientationPortrait) 
     { 
      self.view = self.portrait; 
      self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(360)); 
     } 
     else if (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft) 
     { 
      self.view = self.landscape; 
      self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(-90)); 
     } 
     else if (toInterfaceOrientation == UIInterfaceOrientationLandscapeRight) 
     { 
      self.view = self.landscape; 
      self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(90)); 
     } 
     else 
     { 
      self.view = self.portrait; 
      self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(-180)); 
     } 
    } 
} 

Ma tutto il lavoro disordinato. La vista orizzontale non riempie correttamente l'area e i controlli si trovano in posizioni errate, diverse come prima.

Inoltre, non ho ancora trovato un modo per nascondere tutto il resto ...

risposta

1

È possibile nascondere la barra di stato chiamando

setStatusBarHidden:(BOOL) 

su un riferimento UIApplication, in questo modo.

- (void)applicationDidFinishLaunching:(UIApplication *)application { 

[application setStatusBarHidden:YES]; 

} 

per sbarazzarsi della barra delle linguette si può fare una presa di riferimento in Interface Builder per il codice e chiamare

[myUITabBar removeFromSuperview]; 

Potrebbe funzionare, anche se non ho provato, come per gli altri domande, non sono al 100%, non avendo affrontato i problemi prima.

1

Ok, questo è quanto ho messo questo al lavoro:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation 
           duration:(NSTimeInterval)duration { 
    if (self.landscape) { 
     if (toInterfaceOrientation == UIInterfaceOrientationPortrait) 
     { 
      self.view = self.portrait; 
      //self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(360)); 
     } 
     else if (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft) 
     { 
      self.view = self.landscape; 
      //self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(-90)); 
     } 
     else if (toInterfaceOrientation == UIInterfaceOrientationLandscapeRight) 
     { 
      self.view = self.landscape; 
      //self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(90)); 
     } 
     else 
     { 
      self.view = self.portrait; 
      //self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(-180)); 
     } 
    } 
} 

Ora, nella AppDelegate:

- (void) didRotate:(NSNotification *)notification 
{ 
    UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation]; 
    [UIView beginAnimations:nil context:NULL]; 

    if (orientation == UIDeviceOrientationLandscapeLeft || orientation == UIDeviceOrientationLandscapeRight) 
    { 
     [tabBarController.view setAlpha:0.0]; 
     [tabBarController.view removeFromSuperview]; 

     [[UIApplication sharedApplication] setStatusBarHidden:YES animated:NO]; 
    } else { 
     [tabBarController.view setAlpha:1.0]; 
     [[UIApplication sharedApplication] setStatusBarHidden:NO animated:NO];  
    } 
    [UIView commitAnimations]; 
} 

Ma allora come impostare la vista corrente e come ripristinare la barra delle linguette?

1

Quando guardo l'app per iPod, mi sembra che la vista TabBarController non venga sostituita o modificata in alcun modo. Penso che ci sia solo una transizione di dissolvenza tra la vista tabollontroller e la vista coverflow.

Se fossi in te, vorrei provare (non so se questo potrebbe funzionare) con un controller coverflow, con la sua visualizzazione visualizzata in cima alla vista di tabBarController. Se impedirebbe a tabBarController di autorotare la sua vista, ma in quel momento avrei sfumato la sua vista e si dissolverebbe nella vista del flusso di copertura, che sarebbe solo orizzontale.

Non so se lo statusBar avrebbe un comportamento corretto, e ho lasciato un sacco di dettagli per voi per risolvere, ma in ogni caso penso che sarebbe una buona idea avere due controller separati, uno mostrato in orizzontale, l'altro (il tabBar) in verticale.

Spero che ti possa aiutare.

1

Sembra che ci sia un discreto numero di programmatori che desiderano avere un elemento della barra delle schede portarli a una visualizzazione orizzontale a schermo intero (nessuna barra di stato, nessuna barra delle schede) e quindi tornare indietro.

Ho pubblicato un'inchiesta sul fatto che sia effettivamente possibile sul forum degli sviluppatori Apple, ma non ho ancora avuto una risposta.

Perché è così difficile? (scusa, una domanda per principianti? Sembra che alcune cose piuttosto ovvie non dovrebbero essere difficili) Nessuno che ho trovato finora online ha una risposta chiara a questo.

5

Guarda il codice di esempio "AlternateViews" di Apple.

L'idea di base è che è possibile rilevare l'orientamento fisico del dispositivo con le notifiche, quindi attivare un nuovo controller di visualizzazione "modally" e richiedere l'intero schermo. Disabilita la rotazione dell'interfaccia facendo sì che Autorotate ... restituisca SÌ solo per un orientamento, poiché stai facendo tutto manualmente con le notifiche. Quando si modifica l'orientamento fisico, il controller della visualizzazione modale viene presentato o ignorato.

+0

Grazie per questo !! – mobius