2010-10-13 7 views
6

Tengo un UINavigationController con dos UIViewControllers en él (A y B). Desde A, presiono B en la pila. Luego, el usuario reorienta el dispositivo. Necesito mover algunas cosas alrededor de la pantalla (botones, etc.) para que sean visibles en la nueva orientación en A.Cambios en la orientación de UIViewController en una pila UINavigationController

Me parece que se debe llamar a -Autorizar a la orientación de la interfaz tanto en A como en B (y devolver SÍ). Pero la -will/-didRotateFromInterfaceOrientation solo se llamará en el ViewController visible (B). Cuando B sale de la pila, A se muestra con la nueva orientación (correcta) pero sin mover los botones según sea necesario.

Para solucionar esto, me encuentro implementar el siguiente patrón:

en el archivo de cabecera:

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

en el archivo .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; 
} 

Esencialmente, estoy comprobando ver si la orientación cambió en -visualizarAparece y hacer el trabajo para actualizar la IU allí si es necesario. Funciona muy bien, pero esto parece (a) tedioso, y (b) una gran cantidad de código duplicado entre mis diversas clases como A. Puedo arreglar (b) moviendo el código a una superclase común, pero esto todavía parece algo No debería tener que hacer.

¿Hay una forma mejor de mover mis botones en las vistas que no son de lo más alto en la pila de navegación? Mis puntos de vista provienen de .xibs si hay algo en IB que necesito verificar. ¿Debo simplemente diseñar mis vistas de forma que no necesiten mover los botones cuando cambie la orientación?

Gracias!

+0

Mike, tengo una situación similar. Pero, en mi método orientationChanged tengo algunos cálculos que dependen del marco de vista. El marco de visualización por orientación se establece debido a la máscara de aumento automático y en la vista Aparecerá: el marco de visualización no está configurado para una nueva orientación. Por lo tanto, mi cálculo está yendo mal. Pero no puedo manejar este cálculo en viewDidAppear ya que el usuario puede observar las transiciones de los elementos de la UI (calculado). – spd

Respuesta

1

Prefiero hacer todo el diseño posible en -layoutSubviews; hay varias formas de detectar la orientación, pero simplemente comparo bounds.size.width con bounds.size.height.

willAnimateRotationToInterfaceOrientation:duration: es más para animaciones "especiales" como deslizar una vista por la parte inferior y por el lateral.

Combinar esto con el diseño en una plumilla es tedioso. Recientemente, me he burlado de la interfaz de usuario de retrato en la punta hasta que funciona lo suficientemente bien y luego escribí el código equivalente para hacer lo mismo pero también para soportar el paisaje.

+0

Hrm, espero usar IB tanto como pueda, pero esto me da algo más para experimentar. ¡Gracias! –

+0

IB es bueno para hacer algo rápido, o para configurar la barra de pestañas inicial/controles de navegación de la aplicación. Cuando entres en algo complicado (diseño de iPad vs iPhone, filas que parecen decentes a 320, 480, 768 y 1024 px de ancho, i18n), he descubierto que es mucho más fácil hacerlo en código; administrar un bazillion de semillas es una molestia (¡administrar iPad vs iPhone ya es bastante malo!). No importa que la carga de la punta sea lenta; presumiblemente por qué Apple agregó UINib (lo deserializa una vez, por lo que puede crear la misma celda de tabla varias veces rápidamente). –

1

Lo resolví implementando los cambios de IU necesarios en viewDidAppear. En mi caso, simplemente llamo willRotateToInterfaceOrientation.

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

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

se verá mejor si lo hace en viewWillAppear – TigerCoding

Cuestiones relacionadas