En un controlador de eventos (no el «shouldAutorotateToInterfaceOrientation» método) ¿cómo detectar el actual iPad de orientación? Tengo un campo de texto tengo que animar para arriba (cuando aparecerá el teclado) en la vista horizontal, pero no en la vista vertical y quiere saber qué orientación estoy a ver si la animación es necesario.

InformationsquelleAutor MikeN | 2010-04-29

11 Comentarios

  1. 133

    La orientación de la información no es muy consistente, y existen varios enfoques. Si en un controlador de vista, puede utilizar el interfaceOrientation de la propiedad. De otros lugares que usted puede llamar a:

    [[UIDevice currentDevice] orientation]
    

    Alternativamente, usted puede solicitar para recibir a cambio de la orientación de las notificaciones:

    [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:UIDeviceOrientationDidChangeNotification object:nil];
    

    Algunas personas también les gusta para comprobar el estado de la orientación de la barra:

    [UIApplication sharedApplication].statusBarOrientation
    
    • Esto me ayudó mucho. Yo estaba usando [[UIDevice currentDevice] orientación] pero cuando comenzó la frontal del dispositivo hasta que era imposible saber de qué manera la interfaz se estaba enfrentando. El uso de [UIApplication sharedApplication].statusBarOrientation ha solucionado esto para mí. Muchas gracias.
    • statusBarOrientation funciona para mí también.
    • Tenga en cuenta que [[UIDevice currentDevice] orientación] devolverá 0, a menos que la orientación de las notificaciones se han habilitado.
    • [[UIDevice currentDevice] orientación] es defectuoso..Se ha perdido mi tanto tiempo..Gracias..
    • [[UIDevice currentDevice] orientación] puede requerir que usted llame a [[UIDevice currentDevice] beginGeneratingDeviceOrientationnotifications] en el controlador de vista de usted lo está utilizando en.
    • Nota: [[UIDevice currentDevice] orientación] se pone la rotación del dispositivo, no en la interfaz de rotación! Si el usuario ha bloqueado su orientación del dispositivo, la orientación del dispositivo y la interfaz de orientación pueden ser muy diferentes. statusBarOrientation devuelve una interfaz de orientación, la cual es adecuada cuando el usuario bloqueado su orientación del dispositivo.
    • No utilice [[UIDevice currentDevice] orientation] para esto: el valor de La propiedad es una constante que indica la orientación actual del dispositivo. Este valor representa la orientación física del dispositivo y puede ser diferente de la orientación actual de la aplicación de la interfaz de usuario. Consulte «UIDeviceOrientation» para obtener descripciones de los valores posibles.
    • La pregunta está pidiendo la orientación del dispositivo, no el actual de la UI de la aplicación de la orientación, por lo que parece apropiado.
    • ¿Por qué la respuesta incorrecta es la parte de arriba??? UIDevice orientación es para otra cosa y vuelve UIDeviceOrientation que es diferente de la enumeración… Si la fuerza de asignar a hacer UIInterfaceOrientation y estúpido compilador no se quejan, ese es tu problema como desarrollador para entender lo que está mal.
    • En realidad, setOrientation: ¿trabajo – a pesar de que no es oficial de la API. Objetivo C es un lenguaje dinámico, y que es una buena cosa.
    • interfaceOrientation propiedad de ViewControllers está en desuso

  2. 34

    Creo

    [[UIDevice currentDevice] orientation];
    

    no es realmente fiable. A veces funciona, a veces no… En mis aplicaciones, yo uso

    [[UIApplication sharedApplication]statusBarOrientation]; 
    

    y funciona muy bien!

    • [[UIDevice currentDevice] orientación] es defectuoso..Se ha perdido mi tanto tiempo..Gracias..
    • «Fiable» no es el problema. El problema es que UIDevice la orientación no para este propósito. Consulte la documentación: developer.apple.com/library/ios/documentation/uikit/reference/…
    • En mi código, necesito saber para diferentes orientaciones : la interfaz y el dispositivo. El dispositivo es importante cuando usted está tomando fotos.
    • +1, gracias por la respuesta corta 🙂
    • if(UIInterfaceOrientationIsLandscape([[UIApplication sharedApplication]statusBarOrientation])){// landscape}else{//portrait}
  3. 9

    Uno de:

    • Comprobar la interfaceOrientation de la propiedad de los activos de controlador de vista.
    • [UIApplication sharedApplication].statusBarOrientation.
    • [UIDevice currentDevice].orientation. (Puede que tenga que llamar -beginGeneratingDeviceOrientationNotifications.)
  4. 8

    He encontrado un truco para resolver el FaceUp orientación problema!!!

    Retrasar la orientación de verificación hasta DESPUÉS de que la aplicación ha comenzado a correr, a continuación, establezca las variables, ver tamaños, etc.!!!

    //CODE
    
    - (void)viewDidLoad {
    
      [super viewDidLoad];
    
      //DELAY
      [NSTimer scheduledTimerWithTimeInterval:0.5 
                         target:self 
                         selector:@selector(delayedCheck) 
                         userInfo:nil 
                         repeats:NO];
    
    }
    
    
    -(void)delayedCheck{
    
      //DETERMINE ORIENTATION
      if( [UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortrait ){
          FACING = @"PU";
      }
      if( [UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortraitUpsideDown ){
          FACING = @"PD";
      }
      if( [UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationLandscapeLeft ){
          FACING = @"LL";
      }
      if( [UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationLandscapeRight ){
          FACING = @"LR";
      } 
      //DETERMINE ORIENTATION
    
      //START
      [self setStuff];
      //START
    
    }
    
    
    -(void)setStuff{
    
      if( FACING == @"PU" ){
              //logic for Portrait
      }
      else
      if( FACING == @"PD" ){
              //logic for PortraitUpsideDown
      }
      else{ 
      if( FACING == @"LL"){
              //logic for LandscapeLeft
      }
      else
      if( FACING == @"LR" ){
              //logic for LandscapeRight
      }
    
    }
    
    //CODE
    

    Puede addSubviews, la posición de los elementos, etc. en el ‘setStuff función … cualquier cosa que, en principio, depende de la orientación!!!

    😀

    -Chris Allinson

    • Sí, pero lo que si su aplicación se para dibujar algo antes, porque la pantalla se pondrá en negro de otra manera?
    • Cuando una aplicación se lanza inicialmente muestra la pantalla de presentación de la imagen. En las aplicaciones que hacen que por lo general tienen el appDelegate viewcontroller del .xib archivo de mostrar la misma imagen de la pantalla de inicio y, a continuación, fade out. Yo escuche cuando el fundido de salida ha terminado y, a continuación, agregar subvistas que tiene un alfa de 0.0 y luego se desvanecen en. Es un buen efecto (similar a los juegos de video que muestran la contribución de las empresas antes de poder jugar). Mantengo todos mis lógica del dibujo en estas clases agregadas por lo que la aplicación ya ha terminado de lanzar y se ejecuta cuando el dibujo se ejecuta el código.
    • De forma asíncrona el envío a la cola principal es suficiente. El evento se sigue fuego después de la orientación se ha manejado, pero antes de que las actualizaciones de pantalla.
  5. 3

    Puede lograr de dos maneras:

    1 – mediante el método siguiente:

    **Poner la siguiente línea en el -(void)viewDidLoad Método:

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(deviceRotated:) name:UIDeviceOrientationDidChangeNotification object:nil];
    

    a continuación, poner este método dentro de la clase

    -(void)deviceRotated:(NSNotification*)notification
    {
    
       UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
        if(orientation == UIInterfaceOrientationLandscapeLeft || orientation == UIInterfaceOrientationLandscapeRight)
        {
            //Do your textField animation here
        }
    }
    

    El método anterior se compruebe la orientación cuando el dispositivo será girado

    2 – La segunda forma es mediante la inserción del siguiente a la notificación dentro de -(void)viewDidLoad

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkRotation:) name:UIApplicationDidChangeStatusBarOrientationNotification object:nil];
    

    a continuación, poner el siguiente método dentro de la clase

    -(void)checkRotation:(NSNotification*)notification
    {
        UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
        if(orientation == UIInterfaceOrientationLandscapeLeft || orientation == UIInterfaceOrientationLandscapeRight)
        {
             //Do your textField animation here
        }
    }
    

    El método anterior se compruebe la orientación de la barra de estado del iPhone o ipad y te hacen hacer la animación en la orientación requerida.

  6. 2

    Para la determinación de paisaje vs retrato, hay una función incorporada:

    UIInterfaceOrientation orientation = [[UIDevice currentDevice] orientation];
    BOOL inLandscape = UIDeviceOrientationIsLandscape(orientation);
    
  7. 1

    [UIApplication sharedApplication].statusBarOrientation devuelve retrato de cuando es el paisaje, y el paisaje cuando es vertical en el momento del lanzamiento, en el iPad

  8. 0

    No sé por qué, pero cada vez que mi aplicación se inicia, los primeros 4 son correctas, pero luego llego la orientación opuesta. Yo uso una variable estática que contar esto, entonces tiene un BOOL para voltear cómo puedo enviar manualmente esta a subvistas.

    Así que mientras yo no estoy añadiendo un nuevo stand-alone respuesta, estoy diciendo que use el de arriba y tener esto en mente. Nota: estoy recibiendo la barra de estado de orientación, ya que es la única cosa que se llama cuando se inicia la aplicación y es «suficiente» para que me ayude a mover las cosas.

    El principal problema con el uso esta es la opinión de ser perezosamente cargado. Asegúrese de llamar a la propiedad vista de su contenido y subvistas «Antes» de conjunto de sus posiciones en respuesta a su orientación. Gracias a Apple para no estrellarse cuando hemos conjunto de variables que no existen, lo que nos obliga a recordar que romper OO y nos obligan a hacerlo también… gah, un sistema elegante a la vez tan roto! En serio, me encanta la de los Nativos, pero simplemente no es buena, anima a los pobres OO diseño. No es nuestra culpa, sólo recuerda que su función de cambiar el tamaño podría estar trabajando, pero Apple requiere que la carga de la vista por el uso, no por la creación e inicialización de que

  9. 0

    En su controlador de vista, obtener el valor de sólo lectura de sí mismo.interfaceOrientation (la actual orientación de la interfaz).

  10. 0

    He probado muchos de los métodos anteriores, pero nada parecía funcionar al 100% para mí.

    Mi solución fue hacer un iVar llamado orientación de tipo UIInterfaceOrientation en la Raíz de Controlador de Vista.

    - (void)viewDidLoad {
    
        [super viewDidLoad];
        orientation = self.interfaceOrientation; //this is accurate in iOS 6 at this point but not iOS 5; iOS 5 always returns portrait on app launch through viewDidLoad and viewWillAppear no matter which technique you use.
    }
    
    
    - (BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation{
        return YES;
    }
    
    -(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{
    
        orientation =  toInterfaceOrientation;
    
    }
    

    Entonces, en cualquier lugar donde usted necesita para comprobar la orientación que usted puede hacer algo como esto:

     if(UIInterfaceOrientationIsPortrait(orientation)){
        //portrait
      }else{
       //landscape
      }
    

    Todavía puede haber una mejor manera, pero esto parece funcionar 98% del tiempo (iOS5 no obstante) y no es demasiado difícil. Tenga en cuenta que iOS5 siempre lanza el iPad en la vista vertical, luego se envía a un dispositivo de la willRotateTo – y didRotateFromInterfaceOrientation: mensajes, por lo que el valor va a ser todavía inexacta brevemente.

  11. -1

    [UIDevice currentDevice].orientation de las grandes obras.

    PERO!!!
    … el truco es añadir a (void)viewWillAppear:(BOOL)animated

    exp:

    (void)viewWillAppear:(BOOL)animated{
       ...
       BOOL isLandscape = UIInterfaceOrientationIsLandscape(self.interfaceOrientation);
       ...
    }
    

    Si llamarlo – (void)viewDidLoad, no funciona fiables, especialmente si usted hacer uso de múltiples hilos (principal subproceso de interfaz de usuario, subproceso de fondo para el acceso masivo de datos externos, …).


    Comentarios:
    1) Incluso si su aplicación establece por defecto la orientación de retrato, el usuario puede bloquear en el paisaje. De esta manera establecer el valor predeterminado no es realmente una solución para trabajar alrededor de ella.
    2) Hay otras tareas como ocultar la barra de navegación, para ser colocado en viewWillAppear para hacer el trabajo y al mismo tiempo evitar el parpadeo. Mismo se aplica a otros puntos de vista como UITableView willDisplayCell -> se usa para fijar la celda.seleccionado y de la célula.accessoryType.

Dejar respuesta

Please enter your comment!
Please enter your name here