No necesito especificar la orientación en este caso, solo hay que detectarlo, pero estoy teniendo problemas. He de código condicional que debe trabajar sólo en vertical, y si el dispositivo está en el paisaje necesito hacer algo más. Desde el deviceOrientation no es necesariamente el mismo que el interfaceOrientation, yo no puedo venir para arriba con una manera de poner a prueba para el modo de retrato.

La mayoría de los tutoriales que encuentro en Google son maneras de fuerza paisaje o hacer algún tipo de rotación. La única cosa que quiero hacer es determinar cuál es la orientación. Aquí está mi código, que no es de trabajo:

-(void)viewDidLoad {
    [super viewDidLoad];
    //currentOrientation is declared as UIInterfaceOrientation currentOrientation
    currentOrientation = [[UIApplication sharedApplication] statusBarOrientation];
NSLog(@"%@",currentOrientation);  //== NULL
}

Necesito para determinar el valor de la interfaceOrientation y programa de forma condicional. Gracias por su ayuda!

InformationsquelleAutor Justin | 2010-04-10

10 Comentarios

  1. 77

    Es usted consciente de la interfaceOrientation propiedad de la UIViewController clase?

    - (void) viewDidLoad {
        [super viewDidLoad];
        BOOL isPortrait = UIDeviceOrientationIsPortrait(self.interfaceOrientation);
        //now do whatever you need
    }

    O después de [[UIDevice currentDevice] orientación]?

    • Su respuesta ayuda enormemente. Ahora todo lo que tiene que probar es si isPortrait es cierto, en lugar de tratar de añadir la orientación de código en el viewController métodos de rotación de
    • Ser conscientes de que esto no siempre parece funcionar. Especialmente si el controlador es el primero en su aplicación. En mi simulador de pruebas [auto interfaceOrientation] siempre devuelve como 1. Tal vez sea diferente en el dispositivo real.. al menos.. duro a prueba.
    • creo que cuando la aplicación se inicia, la orientación predeterminada es vertical. Eso podría explicar por qué [auto interfaceOrientation] siempre devuelve 1.
    • isPortrait bool valor de volver a mí «SÍ» en el simulador. No he dispositivo iPad, entonces, ¿cómo puedo detectar actual de la orientación del dispositivo en viewDidLoad?
    • esto no funciona en detailViewController dentro de una vista dividida… isPortrait es siempre SÍ. Alguna idea?
    • Sólo me encontré con este problema yo mismo. La razón última es que self.interfaceOrientation es NULL cuando la vista se carga inicialmente, de manera que ambos UIDeviceOrientationIsPortrait y UIDeviceOrientationIsLandscape NO volver. El uso de [UIApplication sharedApplication].statusBarOrientation en la respuesta de abajo siempre funciona correctamente, ya que la orientación es nunca NULA.
    • no es cierto, como otros han mencionado: es a menudo (en mi caso, siempre) 1 (retrato) cuando se inicia la aplicación. No hay ninguna diferencia entre interfaceOrientation en la (primera) controlador de vista o [UIApplication sharedApplication] bien. Es realmente difícil, si no imposible conocer la interfaz de usuario de orientación en el lanzamiento (de la orientación del dispositivo no dicen nada cuando es hacia arriba o hacia abajo).
    • lo que no es cierto, que yo.interfaceOrientation es NULO en la carga inicial o que la statusBarOrientation nunca es NULA? Esos son ambas verdaderas para mí.
    • No me gusta el uso de UIDeviceOrientation para las orientaciones desde cuando está boca arriba / boca abajo es más o menos inútil si usted está tratando de determinar si su aplicación es en horizontal o vertical. Esto provocó inicialmente un error en mi código, hasta que me pasó a usar [UIApplication sharedApplication].statusBarOrientation. Sin embargo, yo no estaba tratando de obtener la orientación durante el inicio… Sólo mis pensamientos sobre esto.
    • el uso de [[UIDevice currentDevice] orientación] en viewDidLoad
    • Si usted va a inspeccionar el auto.interfaceOrientation necesita utilizar UIInterfaceOrientationIsPortrait() en lugar de UIDeviceOrientationIsPortrait().
    • interfaceOrientation primero en desuso en iOS 8.0

  2. 40

    Especialmente en su lanzamiento, he encontrado que los siguientes sean siempre exactos para la interfaz de usuario, independientemente de lo que el UIDevice dice que la orientación es.

    [UIApplication sharedApplication].statusBarOrientation
    • Um, no es que básicamente lo mismo en la pregunta original? Yo me he encontrado en mis pruebas, que siempre devuelve 1 cuando la aplicación inits, y por lo tanto es bastante inútil.
    • Creo que estás en lo correcto. Ni idea de por qué he publicado esto en mayo, en efecto, parece que es el mismo código que el original. Yo haya entendido mal la pregunta, ya que yo he utilizado los de arriba cuando la orientación del dispositivo es desconocido, boca arriba o boca abajo.
    • Impresionante, realmente confiable en la tarjeta sim. Gracias!
    • esto es muy útil para mí, porque la primera vez que ejecute UIInterfaceOrientation orientación = (UIInterfaceOrientation)[UIDevice currentDevice].orientación; siempre devolverá 0 . incluso si es vertical.
    • Por desgracia, esta bastante buena solución está en desuso en iOS 9
  3. 10

    self.interfaceOrientation es poco fiable en ciertas situaciones. Por ejemplo, la re-organización de las fichas en un tabbar aplicación devuelve el valor incorrecto.

    Sin embargo [UIApplication sharedApplication].statusBarOrientation siempre es fiable. Usted me salvó un montón de tiempo slycrel. Gracias.

    • Cabe señalar que se trata de no seguro asumir statusBarOrientation es válido temprano en la ejecución. Me aparece como si este valor se actualiza después de didFinishLaunchingWithOptions salidas. Que está utilizando el simulador de iOS 4.3.
  4. 4
    UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
    
    if ((orientation == UIInterfaceOrientationLandscapeLeft)
    ||  (orientation == UIInterfaceOrientationLandscapeRight) )
    {
        //Landscape
    }
    else
    {
        //Portrait
    }
    • aka UIInterfaceOrientationIsLandscape()
  5. 1

    Sé que es muy viejo el post. Cómo siempre, me gustaría añadir un punto para decir que es mejor para comprobar el estado de orientación de la barra es mejor. Cuando cada vez que te llame self.interfaceorientation está llamando a shouldRotateToOrientation cada vez. Si usted ha escrito algo de código en el método será ejecutado. Así que tenga cuidado!.

  6. 1
        UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation;
        UIInterfaceOrientation statusBarOrientation = [UIApplication sharedApplication].statusBarOrientation; 
    
        if(deviceOrientation == UIDeviceOrientationFaceUp || deviceOrientation == UIDeviceOrientationFaceDown){
            if(debug){
                NSLog(@"Nothing to change because it is gone to Flat");
            }
            return;
        }
        if(deviceOrientation !=statusBarOrientation){
            if(debug){
                NSLog(@"\nApple has a bug?:\n UIDeviceOrientation : %d, UIInterfaceOrientation: %d",deviceOrientation, statusBarOrientation  );
            }
        }

    No me creen hasta que se verá en la consola de la segunda salida!
    Algunas situaciones – y que existe! – se muestra la última NSLog contenido!

    Que usted tiene que hacer algunas soluciones a ir en ese camino, donde iOS no tiene ningún bug, buena suerte para todos!!!

    Ah que … moderador del foro tal vez va a borrar este post, porque esto no pretende ser y la respuesta en su opinión!

    Espero te sirva de ayuda para alguien una vez, sucede en el iphone también…(no tengo)

  7. 1

    Se mezcla un poco:

    BOOL isLandscape = self.view.frame.size.width > self.view.frame.size.height;

    (editar) Obviamente las respuestas anteriores son la manera correcta de hacerlo y esta solución podría fallar en una situación en la que la vista de los controladores no son de pantalla completa.

  8. 1
    -(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{</br>
       if (UIDeviceOrientationIsLandscape(toInterfaceOrientation)) {</br>
            some instructions;
       } else { 
            some instructions;
       }
    }

    Este es un fragmento de uno de mis programas.
    Usted podría, por supuesto, el uso de la instrucción if en su ViewDidLoad la notificación.

  9. 1

    Ya he votado la respuesta por @slycrel, pero me gustaría tomar el tiempo para escribir esto, y punto algunas cosas que parece estar perdida en esta vieja pregunta, y muchas otras preguntas sobre el tema.

    Es cierto que Apple en realidad no quiere que nosotros para actualizar la mayor parte de nuestra interfaz de usuario basada en los cambios de orientación, pero aún así es totalmente posible y a veces necesario en un caso, y será de esa manera hasta que Apple mejora su nuevo(ish) Api (por ejemplo, viewWillTransitionToFrame: sería más útil que viewWillTransitionToSize:. Just sayin’)

    Y por eso he votado la respuesta por @slycrel está relacionado con lo que usted necesita para tener en cuenta como la lógica de la diferencia entre UIDeviceOrientation y UIInterfaceOrientation.

    La barra de estado es lo que denota una aplicación que actualmente se conoce UIInterfaceOrientation. Todas estas cosas acerca de FaceUp, FaceDown sólo está relacionada con una orientación del dispositivo, no necesariamente en su aplicación. Una aplicación no es compatible con el dispositivo orientaciones de todos modos. Realmente, UIDeviceOrientation puede ser ignorada por completo si todo lo que tienes que hacer es asegurarse de que el diseño y la animación de las cosas adecuadamente en su interfaz, que es el 99% de un desarrollador de aplicaciones de casos de uso. Esto se realiza en la actualidad con la barra de estado del UIInterfaceOrientation de @slycrel la respuesta:

    [UIApplication sharedApplication].statusBarOrientation

    Cabe señalar, que el readwrite versión de esta propiedad está en desuso, el readonly versión no.

    Tomar este ejemplo:

    • Tengo una aplicación que soporta TODAS las interfaces orientaciones, y de la raíz de controlador de vista de que los apoya así.
    • Ahora, me voy a presentar una UIViewController, que será el resultado en la barra de estado, orientación a convertirse en paisaje.
    • Que la orientación horizontal (izquierda o derecha) va a que está basado en lo que es devuelto por preferredInterfaceOrientationForPresentation para que el controlador de vista, lo que la actual orientación del dispositivo es, y lo de la interfaz orientaciones del controlador de vista de los apoyos (ver siguiente punto).
    • La barra de estado se vaya a paisaje, independientemente de lo que la actual orientación del dispositivo es, porque este punto de vista controlador sólo admite paisaje basado en lo que es devuelto por supportedInterfaceOrientations. Digamos que el apoyo horizontal a la izquierda y a la derecha con UIInterfaceOrientationMaskLandscape.
    • También quiero condicionalmente animar este punto de vista controlador en la posición con una transformación de rotación. Esto sólo será necesario cuando va de retrato o retrato boca abajo, en el paisaje de la izquierda o de paisaje a la derecha. De lo contrario, será una más simple presentación de la animación sin rotación.
    • Luego, después de algún tiempo y el uso de dispositivos, me descartar que el controlador de vista.
    • Ahora quiero condicionalmente animar este controlador de vista fuera de la pantalla con otra transformación de rotación. Esto sólo será necesario cuando va desde el paisaje a la izquierda o paisaje a la derecha, retrato o retrato boca abajo. De lo contrario, será una más simple despido de animación sin rotación.
    • En este punto, la barra de estado de la orientación se convertirá en lo que decide el sistema es apropiado para la combinación de la raíz a la vista del controlador de interfaz preferida de la orientación y de interfaz compatible con las orientaciones, así como la actual del dispositivo UIDeviceOrientation.
    • Desde el punto de vista controlador que se va a apoya a TODOS los de la interfaz de orientaciones, si su dispositivo de orientación es hacia arriba o hacia Abajo, no se puede de forma fiable adivinar el siguiente UIInterfaceOrientation basado en UIDeviceOrientation, y no tiene, de todos modos.
    • Así que… de la barra de estado de la orientación al rescate!

    El ejemplo anterior es posible, porque el estado de la orientación de la barra no se actualiza cuando un controlador de vista de la transición está a punto de comenzar (el sistema le pide una transición delegado de un animador, etc.). A continuación, se actualiza cuando la transición se inicia la animación (por ejemplo, por el tiempo animationTransition: se llama). De esta manera, usted debe tener una buena comparación sólo con la inicial y el valor actual de la barra de estado del UIInterfaceOrientation.

    Incluso sin el uso de controlador de vista de las transiciones, que todavía debe ser seguro para la actualización de las opiniones basadas en la barra de estado de la orientación.

    Tenga en cuenta, si la actualización manual de la barra de estado, y si no está utilizando el «controlador de Vista basado en la apariencia de la barra de estado» en su Información.plist, entonces la lógica de tu aplicación debe ser consciente de cuando la barra de estado y se hizo el cambio de orientación. Usted probablemente estará en busca de una pareja NSNotification nombres para estos casos, que son:

    • UIApplicationWillChangeStatusBarOrientationNotification
    • UIApplicationDidChangeStatusBarOrientationNotification

    Así como estos UIApplicationDelegate métodos:

    - (void)application:(UIApplication *)application willChangeStatusBarOrientation:(UIInterfaceOrientation)newStatusBarOrientation duration:(NSTimeInterval)duration;
    - (void)application:(UIApplication *)application didChangeStatusBarOrientation:(UIInterfaceOrientation)oldStatusBarOrientation;
    - (UIInterfaceOrientationMask)supportedInterfaceOrientationsForWindow:(nullable UIWindow *)window

    Y este otro útil UIApplication propiedad:

    @property(nonatomic,readonly) NSTimeInterval statusBarOrientationAnimationDuration;
  10. 0

    Como de iOS8, APIs han sido censurados o volver ineficiente de los resultados, tales como .FaceUp .FaceDown

    Esto es debido a que Apple NO quiere que la actualización de la interfaz de usuario mediante la orientación, sino más bien mediante el uso de clases de tamaño, restricciones, y la proporción (el uso de n% de superview).

    De hecho, la orientación dependiente de código puede no dar buenos resultados en toda la gama de dispositivos y de casos de uso (especialmente multitarea)

    • A veces se necesita la orientación del dispositivo para girar la entrada de la cámara de

Dejar respuesta

Please enter your comment!
Please enter your name here