2010-10-13 11 views
6

Ho un UINavigationController con due UIViewControllers su di esso (A e B). Da A, spingo B in pila. Quindi l'utente orienta nuovamente il dispositivo. Ho bisogno di spostare alcune cose sullo schermo (pulsanti, ecc.) Per essere visibili nel nuovo orientamento su A.L'orientamento di UIViewController cambia in uno stack UINavigationController

Trovo che -shouldAutorotateToInterfaceOrientation venga richiamato sia A che B (e restituendo SÌ). Ma il -will/-didRotateFromInterfaceOrientation viene chiamato solo sul ViewController (B) visibile. Quando B viene estratto dalla pila, A viene mostrato nel nuovo orientamento (corretto) ma senza che i pulsanti vengano spostati secondo necessità.

Per risolvere questo problema, mi ritrovo attuare il seguente schema:

nel file di intestazione:

@interface A : UIViewController { 
    // ... 
    UIInterfaceOrientation layoutOrientation; 
} 
// ... 
- (void)orientationChanged; 
@end 

nel file di .m:

- (void)viewDidLoad { 
    // ... 
    layoutOrientation = self.interfaceOrientation; 
} 

- (void)viewWillAppear:(BOOL)animated { 
    // ... 
    if (layoutOrientation != self.interfaceOrientation) { 
     [self orientationChanged]; 
    } 
} 

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    [self orientationChanged]; 
} 

- (void)orientationChanged { 
    // move my buttons 
    layoutOrientation = self.interfaceOrientation; 
} 

In sostanza, sto controllando a vedere se l'orientamento è cambiato in -viewWillAppear e fare il lavoro per aggiornare l'interfaccia utente lì se necessario. Funziona bene, ma questo sembra (a) noioso, e (b) un sacco di codice duplicato tra le mie varie classi come A. Posso correggere (b) spostando il codice in una superclasse comune, ma questo sembra ancora qualcosa Non dovrei farlo.

C'è un modo migliore di spostare i miei pulsanti su viste che non sono al massimo sullo stack di navigazione? Le mie opinioni provengono da .xibs se c'è qualcosa in IB che devo controllare. Dovrei semplicemente progettare le mie viste in modo tale da non dover spostare i pulsanti quando l'orientamento cambia?

Grazie!

+0

Mike, ho una situazione simile. Ma, nel mio metodo di orientamento, ho alcuni calcoli che dipendono dal frame della vista. Visualizza cornice per orientamento è impostato a causa della maschera di autoresizzazione e in viewWillAppear: la cornice della vista non è impostata per il nuovo orientamento. Quindi, il mio calcolo sta andando male. Ma, non posso gestire questo calcolo in viewDidAppear poiché l'utente può osservare le transizioni degli elementi dell'interfaccia utente (calcolati). – spd

risposta

1

Preferisco fare più layout possibile in -layoutSubviews; ci sono vari modi per rilevare l'orientamento, ma mi limito a confrontare bounds.size.width per bounds.size.height.

willAnimateRotationToInterfaceOrientation:duration: è più per animazioni "speciali" come far scorrere una vista dal basso verso l'interno.

La combinazione di questo layout con un pennino è noiosa. Recentemente, ho appena preso in giro l'interfaccia utente ritratto nel pennino fino a quando non funziona abbastanza bene e poi ho scritto codice equivalente per fare la stessa cosa ma anche supportare il panorama.

+0

Hrm, spero di usare IB il più possibile, ma questo mi dà qualcos'altro da sperimentare. Grazie! –

+0

IB è bello fare qualcosa di veloce, o per configurare i controlli iniziali della barra delle linguette/nav. Quando si entra in qualcosa di complicato (layout iPad vs iPhone, righe che sembrano decenti a 320, 480, 768 e 1024 px di larghezza, i18n), ho scoperto che è molto più facile farlo semplicemente in codice; gestire un pennino di biliardo è un dolore (gestire iPad vs iPhone è già abbastanza brutto!). Non importa che il caricamento del pennino sia lento; presumibilmente perché Apple ha aggiunto Uinib (lo deserializza una volta, quindi è possibile creare la stessa cella di tabella più volte velocemente). –

1

Ho risolto implementando le necessarie modifiche dell'interfaccia in viewDidAppear. Nel mio caso, chiamo semplicemente willRotateToInterfaceOrientation.

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 

    [self willRotateToInterfaceOrientation:self.interfaceOrientation duration:0]; 
} 
+0

sembrerà più bello se lo fai in viewWillAppear – TigerCoding

Problemi correlati