Necesito para detectar cuando el dispositivo está en posición vertical, de modo que yo pueda disparar una animación especial. Pero yo no quiero que mi vista a la rotación automática.

¿Cómo puedo anular una vista autorotating cuando se gira el dispositivo en vertical? Mi aplicación solo necesita mostrar la vista en el paisaje, pero parece que necesita para apoyar el retrato también si quiero ser capaz de detectar una rotación vertical.

  • Nota. Es probable que sea más moderno de usar sólo viewDidLayoutSubviews, que se hará cargo de todos los cambios de diseño. (Recordemos que en el futuro cercano, los usuarios estarán cambio de tamaño de las aplicaciones en windows en los dispositivos.) Reactivo de diseño es la norma ahora.
InformationsquelleAutor Jace999 | 2012-02-03

7 Comentarios

  1. 170

    Trate de hacer lo siguiente cuando se carga la aplicación o cuando su vista se carga:

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

    A continuación, agregue el siguiente método:

    - (void) orientationChanged:(NSNotification *)note
    {
       UIDevice * device = note.object;
       switch(device.orientation)
       {
           case UIDeviceOrientationPortrait:
           /* start special animation */
           break;
    
           case UIDeviceOrientationPortraitUpsideDown:
           /* start special animation */
           break;
    
           default:
           break;
       };
    }

    El de arriba te permitirá registrar los cambios de orientación del dispositivo sin tener que activar la rotación automática de la vista.


    Nota

    En todos los casos en iOS, cuando se agrega un observador, quitarla también en los momentos apropiados (posiblemente, pero no siempre, cuando la vista aparece/desaparece). Usted sólo puede tener «pares» de observar/unobserve código. Si no hacen esto, la aplicación se bloqueará. La elección de dónde observar/unobserve está más allá del alcance de este control de calidad. Sin embargo, usted debe tener una «unobserve» para que coincida con la de «observar» código de arriba.

    • hay algo que se debe tener cuidado aquí. (int)del dispositivo.la orientación puede ser de 1 o 2 en el retrato, 3 o 4 en el paisaje. Y no es un «5», lo que significa que el dispositivo es simplemente de pie en un escritorio, que devuelve como el paisaje, si usted está comprobando con UIDeviceOrientationIsLandscape(dispositivo.la orientación). Usted puede obtener este «paisaje» respuesta a pesar de que su app/dispositivo está en el modo de retrato.
    • UIDevice no dan orientación si se inicia la aplicación y hasta que la aplicación cambia de orientación. Otra posibilidad para iOS>5 [UIApplication sharedApplication].statusBarOrientation
    • No te olvides de quitar observador en un lugar adecuado (dependiendo de donde has añadido) de lo contrario obtendrá excepción..
  2. 17

    Si usted llegó a esta pregunta buscando la manera de detectar un cambio de orientación (sin necesariamente querer deshabilitar la rotación), también debe ser consciente de viewWillTransitionToSize, que está disponible en iOS 8.

    Swift ejemplo de aquí

    override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
    
        coordinator.animateAlongsideTransition({ (UIViewControllerTransitionCoordinatorContext) -> Void in
    
            let orient = UIApplication.sharedApplication().statusBarOrientation
    
            switch orient {
            case .Portrait:
                println("Portrait")
                //Do something
            default:
                println("Anything But Portrait")
                //Do something else
            }
    
            }, completion: { (UIViewControllerTransitionCoordinatorContext) -> Void in
                println("rotation completed")
        })
    
        super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
    }

    Y si usted no necesita preocuparse acerca de la orientación real:

    override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
    
        //do something
    
        super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
    }

    Objective-C ejemplo de aquí

    - (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
    {   
        [coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context)
        {
            UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
            //do whatever
        } completion:^(id<UIViewControllerTransitionCoordinatorContext> context)
        { 
    
        }];
    
        [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
    }

    Y si usted no necesita preocuparse acerca de la orientación real (tomado de esta respuesta):

    - (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
    {
        //Do view manipulation here.
        [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
    }

    Ver también

    • viewWillTransitionToSize será llamada, incluso si usted minimizar la aplicación o el botón de encendido pulse.
  3. 3

    1) Swift versión de David, la respuesta de
    2) En caso de que desea detectar la orientación cuando no hay cambio de orientación (Swift vesión de Moe, la respuesta a ¿Cómo detectar la orientación del dispositivo en iOS?)

        //Initial device orientation
        let orientation: UIInterfaceOrientation = UIApplication.sharedApplication().statusBarOrientation
        if(orientation == UIInterfaceOrientation.Unknown){
            //code for Unknown
        }
        else if(orientation == UIInterfaceOrientation.Portrait){
            //code for Portrait
        }
        else if(orientation == UIInterfaceOrientation.PortraitUpsideDown){
            //code for Portrait
        }
        else if(orientation == UIInterfaceOrientation.LandscapeRight){
            //code for Landscape        
        }
        else if(orientation == UIInterfaceOrientation.LandscapeLeft){
            //ode for Landscape
        }
    
        //To detect device orientation change
        UIDevice.currentDevice().beginGeneratingDeviceOrientationNotifications()
        NSNotificationCenter.defaultCenter().addObserver(
            self,
            selector: "orientationChanged:",
            name: UIDeviceOrientationDidChangeNotification,
            object: UIDevice.currentDevice())

    orientationChanged función

    func orientationChanged(note: NSNotification)
    {
        let device: UIDevice = note.object as! UIDevice
        switch(device.orientation)
        {
            case UIDeviceOrientation.Portrait:
            //code for Portrait
            break
            case UIDeviceOrientation.PortraitUpsideDown:
            //code for Portrait
            break
            case UIDeviceOrientation.LandscapeLeft:
            //code for Landscape
            break
            case UIDeviceOrientation.LandscapeRight:
            //code for Landscape
            break
            case UIDeviceOrientation.Unknown:
            //code for Unknown
            break
            default:
            break
        }
    }
  4. 1

    Si he entendido correctamente, la aplicación es sólo horizontal. Simplemente puede especificar en las aplicaciones de instalación que es sólo horizontal y, por tanto, no necesita preocuparse acerca de la rotación. La aplicación se iniciará en el paisaje y la estancia allí, independientemente de cómo el iPad está orientado.

    • Me explico con un ejemplo sencillo. Tengo una aplicación que está destinada a ser vista del paisaje. Mi vista se muestra una tabla con una bola en la parte superior. Cuando se gira el dispositivo en vertical la pelota sale de la tabla. Todo se queda en el paisaje, la mesa, el fondo, etc.
  5. 0

    Deshabilitar todos, pero la orientación que desee (para que no gire)

    A continuación, como dijo David acaba de obtener el dispositivo de orientación actual:

    https://developer.apple.com/library/ios/#documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/MotionEvents/MotionEvents.html

    Alternativamente, usted puede utilizar el acelerómetro sí mismo (desde su cómo está hecho de todos modos)
    y comprobar si la gravedad está en ver cuál es la orientación que tiene. Si usted toma este enfoque se puede jugar con los valores para obtener resultados diferentes.

  6. 0

    Si usted no desea crear el objeto de dispositivo, también puede utilizar

    -(void) seObserverForOrientationChanging
    {
        [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
        [[NSNotificationCenter defaultCenter]
         addObserver:self selector:@selector(orientationChanged:)
         name:UIDeviceOrientationDidChangeNotification
         object:[UIDevice currentDevice]];
    }
    
    
    - (void) orientationChanged:(NSNotification *)note
    {
        if (UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation)){
            //Do something in landscape
        }
        else {
            //Do something in portrait
        }
    }
  7. 0

    .UIDeviceOrientationDidChange notificación es llamado muchas veces en el iphone incluso cuando el dispositivo no gire. No sé la razón, pero si usted necesita sólo cuando el dispositivo realmente girado, a continuación, haga lo siguiente.

    NotificationCenter.default.addObserver(self, selector: #selector(orientationChanged), name: .UIDeviceOrientationDidChange, object: nil)

    El método llamado de observador debe tener este aspecto:

    func orientationChanged() {
    
        if traitCollection.isIphone {
    
            defer {
                self.previousTraitCollectionForIphone = traitCollection
            }
    
            guard let previousTraitCollectionForIphone = previousTraitCollectionForIphone else {
    
                updateView()
                return
            }
    
            if previousTraitCollectionForIphone != traitCollection {
                updateView()
            }
    
        } else {
            updateView()
        }
    }
    • Solución agradable. Una cosa: traitCollection.esiphone no es reconocida en Xcode 8.3 – Swift 3.1. Uso traitCollection.userInterfaceIdiom == .teléfono

Dejar respuesta

Please enter your comment!
Please enter your name here