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