2010-11-21 30 views
6

[Pregunta actualizada]¿Cuál es la forma correcta de detectar la orientación de la interfaz en el lanzamiento?

Así que aquí está el problema, finalmente lo reduje a esto. Si crea un nuevo UIViewController en todos los métodos

- (id)init; 
- (void)loadView; 
- (void)viewDidAppear:(BOOL)animated; 
- (void)viewDidLoad; 
(...) 

El interfaceOrientation estándar es de retrato y si se detecta el modo horizontal girará rápidamente a esa orientación. Que luego puede ser detectado mediante el:

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation; 

El problema es que en el IPAD, es tranquilo difícil preparar su interfaz para la orientación actual de la interfaz dentro de la loadView (o uno de los otros), ya que sólo devolverá Retrato. Esto causará algunos problemas:

1) Quiero que mi contenido se vuelva a cargar en modo retrato, pero NO en modo paisaje. Normalmente colocaría una declaración if en loadView. Si está en modo vertical, vuelva a cargar el contenido. Pero en este caso, siempre devolverá el retrato y, por lo tanto, siempre carga el contenido.

2) Quiero utilizar 'presentPopoverFromRect: inView: allowedArrowDirections: animado:' - método cuando está en modo retrato, por lo que presentará el menú de popover automáticamente cuando se inicie la aplicación. Esto bloqueará la aplicación cuando se lance en modo vertical. Motivo: 'Popovers no pueden presentarse desde una vista que no tiene ventana'.

La única suposición segura está en 'didRotateFromInterfaceOrientation: (UIInterfaceOrientation) fromInterfaceOrientation', pero este método no se activará si se inicia en modo vertical.

// ----

Update (15.37)

'UIApplicationWillChangeStatusBarOrientationNotification'

únicamente se publicará cuando los usuarios permutas de vertical a horizontal (o viceversa vica). Si la interfaz era el problema, entonces esto puede ser fácilmente resuelto con la observación de que la notificación y

if (UIDeviceOrientationIsPortrait(interfaceOrientation)) { 
    // layout subviews for portrait mode 
} else { 
    // layout subviews for landscape mode 
} 

Pero el problema es que yo quiero saber en qué modo es el momento del lanzamiento para determinar en lugar debo o no recargar el contenido No puedo volver a cargar el contenido y cuando lo canjeo a un paisaje, cancélelo.

+0

He intentado hacer el cheque para 'UIDeviceOrientationIsPortrait()' 'en layoutSubviews' de una costumbre' subclase UIView' y me estoy poniendo las orientaciones correctas. ¿Tiene algún otro código que podría compartir que podría ayudar a identificar cuál es el problema? ¿También se pregunta si los valores de UIDeviceOrientation y UIInterfaceOrientation se pueden usar indistintamente? Eso me tiene atrapado con errores extraños antes. – justinkmunger

Respuesta

8

Probar [[UIApplication sharedApplication] statusBarOrientation].

+0

¿Es eso diferente a [[UIApplication sharedApplication] statusBarOrientation]? – Mark

+0

Gah, lo siento. La respuesta esta actualizada. –

1

No estoy seguro de si esto va a resolver mi problema pero mirando a la documentación que encontré lo siguiente:

typedef enum { 
    UIInterfaceOrientationPortrait   = UIDeviceOrientationPortrait, 
    UIInterfaceOrientationPortraitUpsideDown = UIDeviceOrientationPortraitUpsideDown, 
    UIInterfaceOrientationLandscapeLeft  = UIDeviceOrientationLandscapeRight, 
    UIInterfaceOrientationLandscapeRight  = UIDeviceOrientationLandscapeLeft 
} UIInterfaceOrientation; 

y

typedef enum { 
    UIDeviceOrientationUnknown, 
    UIDeviceOrientationPortrait, 
    UIDeviceOrientationPortraitUpsideDown, 
    UIDeviceOrientationLandscapeLeft, 
    UIDeviceOrientationLandscapeRight, 
    UIDeviceOrientationFaceUp, 
    UIDeviceOrientationFaceDown 
} UIDeviceOrientation; 

lo tanto, ya boca arriba y boca abajo se han añadido mirando la orientación del dispositivo no tiene sentido por razones de interfaz. Por lo tanto, teóricamente, @MarkAdams menciona correctamente que en este caso se debe usar [[UIApplication sharedApplication] statusBarOrientation] para la orientación de la interfaz.

O, por supuesto, el UIViewController tiene la opción 'interfaceOrientation'.

6

La manera correcta es preguntar al dispositivo por su orientación ya que una vista técnicamente no tiene orientación. ;)

Tiene la razón al usar . Desde el documentation, puede ver que primero necesita generar notificaciones de orientación del dispositivo antes de que esta información sea correcta. Entonces funcionará según lo deseado.

UIDevice *myDevice = [UIDevice currentDevice]; 
[myDevice beginGeneratingDeviceOrientationNotifications]; 
UIDeviceOrientation currentOrientation = [myDevice orientation]; 
[myDevice endGeneratingDeviceOrientationNotifications]; 

Nota: Esto le da la orientación actual del dispositivo. Si el controlador actualmente visible/vista superior hizo no permite la rotación a esta orientación, sin embargo, obtendrá la orientación actual del dispositivo, no la que el controlador de vista superior utiliza actualmente.


Editar después de la pregunta se actualiza:

Usted está correcto que la orientación para el controlador de vista superior (funcionaba correctamente para los controladores subvista) siempre devuelve 1 (es decir UIInterfaceOrientationPortrait) en loadView. Sin embargo, inmediatamente después se llamará al método willRotateToInterfaceOrientation:duration:, y la orientación que se transmite allí es correcta, por lo que debería poder usar ese método.

- (void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toIfaceOrient 
           duration:(NSTimeInterval)duration 
+0

Hola, Pascal, eso funcionaría para el UIDevice; sin embargo, eso no es lo que estoy buscando. Finalmente reduje el error, actualizaré mi pregunta. – Mark

+0

Actualicé la respuesta, tal vez ese método sea una solución a su problema. – Pascal

Cuestiones relacionadas