2011-03-03 3 views
5

Il mio progetto attuale richiede alcune fantastiche animazioni tra le viste verticali e orizzontali dei dati. La rappresentazione dei dati è abbastanza complessa, quindi tra elementi grafici e dati, ci sono probabilmente circa 30 pulsanti ed etichette sullo schermo contemporaneamente. Ho creato un'interfaccia molto stretta ... ora sto definendo gli elementi per la vista del paesaggio. L'unico modo che ho trovato per fare questo finora è quello di porre in realtà la vista del paesaggio nel codice, per esempio:Esiste un metodo per disegnare visivamente * visuali doppie (panorama + ritratto) in Interface Builder?

-(void) positionViews { 
    UIInterfaceOrientation destOrientation = self.interfaceOrientation; 
    if (destOrientation == UIInterfaceOrientationPortrait || destOrientation == UIInterfaceOrientationPortraitUpsideDown) { 
     //---if rotating into PORTRAIT mode 
     timeBGbox.frame = CGRectMake(14, 88, 134, 14); 
     targetTime.frame = CGRectMake(0, 99, 150, 29); 
     energyBGbox.frame = CGRectMake(156, 88, 68, 14); 
     targetEnergy.frame = CGRectMake(154, 99, 70, 29); 
     speedBGbox.frame = CGRectMake(234, 88, 68, 14); 
     targetSpeed.frame = CGRectMake(226, 99, 48, 29); 
     speedLabel.frame = CGRectMake(264, 99, 40, 36); 
    } else { 
     //---if rotating to LANDSCAPE mode 
     timeBGbox.frame = CGRectMake(156, 12, 152, 14); 
     targetTime.frame = CGRectMake(160, 23, 150, 29); 
     energyBGbox.frame = CGRectMake(156, 50, 68, 14); 
     targetEnergy.frame = CGRectMake(154, 61, 70, 29); 
     speedBGbox.frame = CGRectMake(234, 50, 74, 14); 
     targetSpeed.frame = CGRectMake(228, 61, 48, 29); 
     speedLabel.frame = CGRectMake(269, 61, 40, 36); 
    } 
} 

Questo è un processo faticoso, prendendo molte prove per realizzare quello che ho potuto fare visivamente secondi in IB. Al momento, quando si passa da una visualizzazione all'altra in una IB e si spostano manualmente gli elementi in modalità orizzontale, al passaggio in verticale, si trovano nel posto sbagliato. Ho usato "molle e montanti" nel modo più creativo possibile, ma la maggior parte dei miei elementi ha bisogno di una precisa collocazione manuale oltre il regno di AutoSizing.

La mia domanda è: C'è una modalità di commutazione all'interno di IB che consente di sviluppare due layout grafici di una vista utilizzando gli strumenti di layout visivo, oppure il codice numerico è l'unico modo?

risposta

3

È possibile creare un numero arbitrario di viste nel file del pennino. Puoi chiamare una di esse "portrait view" (per esempio quella che è collegata anche alla presa "view" di File's Owner), e una di esse "landscape view". entrambi definire punti vendita nella tua classe UIViewController:

@property (nonatomic, retain) IBOutlet UIView *portraitView; 
@property (nonatomic, retain) IBOutlet UIView *landscapeView; 

lay out i campi in IB come ti piace. Il trucco allora è che è necessario raddoppiare i punti vendita nel file di intestazione:

@property (nonatomic, retain) IBOutlet UIView *myLabel_portrait; 
@property (nonatomic, retain) IBOutlet UIView *myLabel_landscape; 

e nel codice è necessario mantenere entrambe le versioni aggiornate. La cosa migliore è semplicemente aggiornarli entrambi quando ne aggiorni uno.

Poi il codice per autorotate è davvero semplice, basta:

if (switchingToPortrait) 
    self.view = self.portraitView; 
else 
    self.view = self.landscapeView; 
+2

+1. Questo ha lo svantaggio che gli elementi non rimescolano le nuove posizioni con un'animazione, puoi solo animare la transizione tra le intere viste. – zoul

+1

Lo farei con una terza vista, e in codice posizionare tutti gli elementi sulla vista "temporanea" ruotante usando i fotogrammi della vista verticale, quindi animare le posizioni a quella della vista orizzontale. Usa ancora la tecnica che io do, si espande semplicemente su di esso. È ancora possibile impostare la modalità orizzontale in IB per comodità. – Bogatyr

+0

grazie Bogatyr ... per chiarimenti: stai dicendo che ogni etichetta e pulsante che devo affrontare ha bisogno sia di una versione _portrait che di _landscape? Quindi, in pratica, durante il mio codice aggiornerò contemporaneamente 2 visualizzazioni? – AcroYogi

0

AFAIK non c'è modo di farlo in Interface Builder. Poiché le viste sono istanziate dal file pennino, si otterrebbero comunque due istanze.

Come indicato nei documenti dello sviluppatore, è possibile utilizzare layoutSubviews o semplicemente utilizzare un metodo personalizzato nel proprio controller di visualizzazione come si ha qui.

1

Il meglio che posso pensare è di avere due viste e di modificarle in didRotateFromInterfaceOrientation:.

0

creare una vista del paesaggio e ritratto in Interface Builder. Per ogni posizione di orientamento, i tuoi elementi sono come li vuoi tu. Quando sei soddisfatto del look and feel, copia le coordinate nel metodo "positionViews".

Problemi correlati