2012-12-30 8 views
9

Voglio sostenere paesaggio & orientamento verticale sul mio iPad app che utilizza uno storyboard senza essere coinvolti nei meandri di Auto Layout su iOS6+ e Auto Resizing su iOS 5 e in precedenza (dal momento che l'applicazione supporta sia per iOS 5 & 6 in modo che nessun AutoLayout è permesso qui), quello che ho pensato come un punto di inizio per la soluzione era la seguente:il metodo migliore per supportare più orientamenti su iPad con storyboard (senza layout automatico o il ridimensionamento automatico)

creando due storyboard distinte: MainStoryboard-Portrait & MainStoryboard-Landscape, quando la controller di visualizzazione corrente (chiamiamolo Fir stViewController) è in verticale e l'utente fa ruotare il dispositivo in orizzontale, I instantiate un nuovo FirstViewController da MainStoryboard-Landscape storyboard e viceversa quando l'utente ruota di nuovo in verticale. Ho fatto qualcosa di simile in willRotateToInterfaceOrientation metodo FirstViewController.m:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard-Landscape" bundle:[NSBundle mainBundle]]; 
    FirstViewController *VC = [storyboard instantiateViewControllerWithIdentifier:@"VC1"]; 
    self.view = VC.view; 

ma l'incidente seguente avviene su iOS6 +: A view can only be associated with at most one view controller at a time!, provato anche su iOS5 non ci sarà alcun incidente, ma la rotazione non funziona correttamente: finestra delimita ruota ma la vista stessa rimane così com'è.

Come ottenere il funzionamento su entrambi iOS 5 & 6? o se c'è un altro metodo migliore, per favore forniscici un campione di codice funzionante e ti assegnerò una taglia di 50 punti.

risposta

1

La disposizione automatica è davvero la strada da percorrere. Non appena hai due storyboard hai un problema di manutenzione e coerenza, se vuoi che l'esperienza utente verticale e orizzontale sia la stessa. Se vuoi che siano specifici per una ragione, allora due storyboard sono appropriati.

+1

layout automatico è molto complicato quando si inizia a lavorare con un complesso progetto di interfaccia utente – JAHelia

+0

Può essere, ma il progettista di interfaccia utente XCode nasconde un sacco di quella complessità. – Andrew

+4

Questa non è una buona risposta, in quanto ha detto che vuole essere in grado di supportare pre iOS 6. Supportando solo iOS 6, si uccide in modo efficace gran parte della base utenti. L'adozione di iOS 6 è buona, ma non è così buona. – jmstone617

8

se davvero non si desidera utilizzare il layout automatico, facendo questo in un unico .storyboard può ancora essere fatto avendo un IBOutlet (weak, nonatomic) UIView* portraitView ed un IBOutlet (weak, nonatomic) UIView* landscapeView. creare ciascuna vista come sottoview del principale view per FirstViewController in .storyboard.

poi nel willRotateToInterfaceOrientation:, procedere come segue:

if (UIInterfaceOrientationIsPortrait(toInterfaceOrientation)) 
    { 
     self.portraitView.hidden = NO; 
     self.landscapeView.hidden = YES; 
    } 
    else 
    { 
     self.portraitView.hidden = YES; 
     self.landscapeView.hidden = NO; 
    } 

quando si lavora su vostro punto di vista in .storyboard, si può vedere ogni visualizzazione secondaria un po 'meglio, controllando/deselezionando la bandiera hidden nella barra laterale destra.

quindi, un altro vantaggio di questo è che se si dispone di alcune viste che sembrano ok indipendentemente dall'orientamento, non è necessario mantenere uno storyboard e una scena separati per loro.

+2

è ancora un problema di progettazione per le visualizzazioni complesse dell'interfaccia utente + penso che ci sarà un maggiore ingombro di memoria che carica due viste contemporaneamente per ogni scena. – JAHelia

+0

se hai uno storyboard con viste verticali e orizzontali con molti controller di visualizzazione, xcode mangerà tutta la memoria anche se la memoria era più di 8 GB – JAHelia

Problemi correlati