Por favor alguien puede decirme la «derecha» o «mejor» enfoque para trabajar con el retrato y el paisaje de la interfaz de orientaciones en iOS 8? Parece que todas las funciones que desea utilizar para este propósito se utilizan en iOS 8, y mi investigación se ha activado ninguna clara, elegante alternativa. Estoy realmente debemos mirar a la anchura y la altura para determinar por mí mismo si estamos en modo retrato o paisaje?

Por ejemplo, en mi punto de vista controlador, ¿cómo debo aplicar el siguiente pseudocódigo?

if we are rotating from portrait to landscape then
  do portrait things
else if we are rotating from landscape to portrait then
  do landscape things
  • Leer la documentación para UIViewController. Consulte la sección titulada «Manejo de Vista Rotaciones». Se explica lo que debe hacer.
  • Que están en desuso es una pista. Tienes que usar algo más….que algo más debe ser Automático y el Tamaño de las Clases 🙂
InformationsquelleAutor rmp251 | 2014-09-26

4 Comentarios

  1. 251

    Apple recomienda el uso de clases de tamaño como un grueso medida de la cantidad de espacio de pantalla disponible, de modo que su interfaz de usuario puede cambiar significativamente su diseño y apariencia. Considere la posibilidad de que un iPad en vertical tiene el mismo tamaño de las clases como en el paisaje (Regular, la anchura, la altura normal). Esto significa que la interfaz de usuario debe ser más o menos similar entre las dos orientaciones.

    Sin embargo, el cambio de vertical a horizontal en un iPad es bastante significativo que usted puede necesitar hacer algunos pequeños ajustes a la interfaz de usuario, aunque el tamaño de las clases no han cambiado. Desde la interfaz de la orientación relativa a los métodos de UIViewController se han quedado obsoletos, Apple ahora recomienda aplicar el siguiente método nuevo en UIViewController como un reemplazo:

    - (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id <UIViewControllerTransitionCoordinator>)coordinator
    {
        [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
    
        //Code here will execute before the rotation begins.
        //Equivalent to placing it in the deprecated method -[willRotateToInterfaceOrientation:duration:]
    
        [coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context) {
    
            //Place code here to perform animations during the rotation.
            //You can pass nil or leave this block empty if not necessary.
    
        } completion:^(id<UIViewControllerTransitionCoordinatorContext> context) {
    
            //Code here will execute after the rotation has finished.
            //Equivalent to placing it in the deprecated method -[didRotateFromInterfaceOrientation:]
    
        }];
    }

    Genial! Ahora usted está consiguiendo las devoluciones de llamada justo antes de que la rotación se inicia y cuando termina. Pero, ¿qué hay de realmente saber si la rotación es en el retrato o paisaje?

    Apple recomienda a pensar acerca de la rotación como simplemente un cambio en el tamaño de la vista principal. En otras palabras, durante un iPad rotación de vertical a horizontal, se puede pensar que es la raíz de vista del nivel de simplemente cambiando su bounds.size de {768, 1024} a {1024, 768}. Sabiendo esto entonces, usted debe utilizar el size pasado en el viewWillTransitionToSize:withTransitionCoordinator: método anterior para averiguar si usted rotativa para modo retrato o paisaje.

    Si quieres que sea aún más perfecta forma de migrar el código de la herencia para el nuevo iOS 8 de forma de hacer las cosas, considerar el uso de esta categoría simple en UIView, que puede ser utilizado para determinar si un punto de vista es el «retrato» o «paisaje» en función de su tamaño.

    Para recapitular:

    1. Debe utilizar el tamaño de las clases para determinar cuándo se han de mostrar fundamentalmente diferente de la UIs (por ejemplo, un «iPhone-como» interfaz de usuario vs un «iPad como» interfaz de usuario)
    2. Si usted necesita para hacer pequeños ajustes a la interfaz de usuario cuando el tamaño de las clases no cambio, pero su contenedor (vista principal) tamaño lo hace, como cuando un iPad gira, el uso de la viewWillTransitionToSize:withTransitionCoordinator: de devolución de llamada en UIViewController.
    3. Cada vista en su aplicación sólo debe tomar las decisiones de diseño basado en el espacio que se le ha dado a la presentación en. Vamos a la jerarquía natural de las vistas de la cascada esta información.
    4. Del mismo modo, no utilice el statusBarOrientation que es básicamente un dispositivo de nivel de propiedad-para determinar si el diseño de un «retrato» vs «paisaje». La barra de estado de la orientación sólo debe ser utilizado por el código de lidiar con cosas como UIWindow que realmente viven en el nivel raíz de la aplicación.
    • Excelente respuesta! Por CIERTO, el vídeo de youtube en AL era increíblemente informativo. Gracias por compartir. Check it out! youtube.com/watch?v=taWaW2GzfCI
    • El único problema que he encontrado es que a veces usted quiere saber de la orientación del dispositivo, y esto no va a dejar que usted lo sepa. En el iPad se llama antes de que la barra de estado o de la orientación del dispositivo cambios de valor. No se puede saber si el usuario mantiene el dispositivo en modo retrato o retrato-al revés. También es imposible de probar, como burlándose de UIViewControllerTransitionCoordinator es una pesadilla 🙁
    • has encontrado una solución elegante para lidiar con esos problemas?
    • entonces, ¿dónde está viewdidlayoutsubviews entonces? Pensé viewdidlayoutsubviews se utiliza para la captura de obligado cambios debido a la rotación. Puede usted comentar sobre eso?
    • Tan grande!!! Gracias por esta respuesta detallada!!!
    • Cómo diferenciar entre el paisaje de la izquierda vs paisaje a la derecha si no hacemos uso de statusbarorientation? Necesito esa distinción. Además, existen otros problemas, como se describe aquí – stackoverflow.com/questions/53364498/…

  2. 15

    Basado en smileyborg muy bien detallados (y aceptado) respuesta, aquí es una adaptación en el uso de swift 3:

    override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
        super.viewWillTransition(to: size, with: coordinator)
        coordinator.animate(alongsideTransition: nil, completion: {
            _ in
            self.collectionView.collectionViewLayout.invalidateLayout()
        })        
    }

    Y en el UICollectionViewDelegateFlowLayout aplicación,

    public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        //retrieve the updated bounds
        let itemWidth = collectionView.bounds.width
        let itemHeight = collectionView.bounds.height
        //do whatever you need to do to adapt to the new size
    }
  3. 11

    Yo simplemente uso el Centro de notificaciones:

    Agregar una orientación variable (se explicará al final)

    //Above viewdidload
    var orientations:UIInterfaceOrientation = UIApplication.sharedApplication().statusBarOrientation

    Agregar una Notificación cuando aparece la vista de

    override func viewDidAppear(animated: Bool) {
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "orientationChanged:", name: UIDeviceOrientationDidChangeNotification, object: nil)
    }

    Quitar Notificación cuando la vista se va

    override func viewWillDisappear(animated: Bool) {
            NSNotificationCenter.defaultCenter().removeObserver(self, name: UIDeviceOrientationDidChangeNotification, object: nil) 
    }

    Recibe orientación actual cuando la notificación se activa

    func orientationChanged (notification: NSNotification) {
        adjustViewsForOrientation(UIApplication.sharedApplication().statusBarOrientation)
    }

    Cheques de orientación (vertical/horizontal) y controla los eventos

    func adjustViewsForOrientation(orientation: UIInterfaceOrientation) {
        if (orientation == UIInterfaceOrientation.Portrait || orientation == UIInterfaceOrientation.PortraitUpsideDown)
        {
            if(orientation != orientations) {
                println("Portrait")
                //Do Rotation stuff here
                orientations = orientation
            }
        }
        else if (orientation == UIInterfaceOrientation.LandscapeLeft || orientation == UIInterfaceOrientation.LandscapeRight)
        {
           if(orientation != orientations) {
                println("Landscape")
                //Do Rotation stuff here
                orientations = orientation
            }
        }
    }

    La razón por la que añadir una orientación variable es debido a que al realizar la prueba en un dispositivo físico de la orientación de la notificación que se llama en cada cambio menor en el dispositivo, y no sólo cuando se gira. Agregar el var y si las declaraciones se solicita el código si se cambió la orientación opuesta.

    • Esto no es de Apple enfoque recomendado porque significa que a cada vista en su aplicación es decidir cómo mostrar basados en la orientación del dispositivo, en lugar de considerar el espacio que se le ha dado.
    • Apple también no toma en hardware en consideración con 8.0. Decirle a un AVPreview capa no necesita preocuparse acerca de la orientación si se presenta más de un controlador de vista. No funciona, pero se fija en el 8,2
    • super de viewDidAppear y viewWillDisappear debe ser llamado
    • Nota : UIDeviceOrientation != UIInterfaceOrientation. En mis experimentos, statusBarOrientation no es confiable.
  4. 2

    Desde una perspectiva de interfaz de usuario, creo que el uso de Clases de Tamaño son de Apple enfoque recomendado para el manejo de interfaces en diferentes orientaciones, dimensiones y escalas.

    Consulte la sección: Rasgos de Describir el Tamaño de la Clase y la Escala de una Interfaz aquí:
    https://developer.apple.com/library/ios/releasenotes/General/WhatsNewIniOS/Articles/iOS8.html

    «iOS 8 añade nuevas características que facilitan el manejo con el tamaño de la pantalla y la orientación mucho más versátil.»

    Este es un buen artículo, así:
    https://carpeaqua.com/thinking-in-terms-of-ios-8-size-classes/

    EDITAR
    Link Actualizado:
    https://carpeaqua.com/2014/06/14/thinking-in-terms-of-ios-8-size-classes/ (Crédito: Koen)

    • El enlace para el artículo no está funcionando.
    • Sí, se parece a todo su sitio está abajo en el momento.
    • El artículo es realmente vale la pena leer, y aquí está la dirección correcta: carpeaqua.com/thinking-in-terms-of-ios-8-size-classes
    • Pero, ¿y si no estamos hablando de tamaño de las clases y la interfaz de usuario, pero sobre AVFoundation, por ejemplo. Cuando la grabación de vídeo, en algunos casos, usted debe saber la viewControllers orientación para establecer los metadatos correctos. Esto es simple imposible. «versátil».
    • Eso no es lo que el OP estaba preguntando/hablando.
    • Actualizado enlace: carpeaqua.com/2014/06/14/…

Dejar respuesta

Please enter your comment!
Please enter your name here